我想在javascript中创建一个Date对象,它代表2014年前的0001年。
我试过
d = new Date(); d.setYear(1);
console.log(d);
但是它给了1901年
使用
d = new Date(1,1,1)
console.log(d);
不行。
我怎样才能创建这个日期?
发布于 2015-04-30 14:12:03
--首先,它根本不是Y2K问题!(更新:在某些情况下--它与Y2K问题有关,但这里不是问题所在)
正确的答案是,不能可靠地执行。夏令时间是否适用于第一年?有多少年的飞跃?有吗?等。但答案是“丹尼尔会用它!”
更新:,更别提@MattJohnson关于DST的帖子了。DST in year 1, actually JS (ES5 anyway) will lie and use the current DST rule for all years
所以,请不要自欺欺人地认为,你可以可靠地处理低于1970年的日期。(即使在那个时间范围内,你也会遇到很多问题和惊喜。)
但是如果你真的真的需要的话,你可以使用new Date('0001-01-01')
(ISO 8601格式)或者@Daniel的方法:
var d = new Date(); d.setFullYear(1);
但在你用之前读一下这个..。
在JS中有4种创建日期的方法:
new Date()
new Date(milliseconds)
new Date(dateString)
new Date(year, month, day, hours, minutes, seconds, milliseconds)
1) new ()创建当前日期(在您的本地时区中),因此目前我们对它不感兴趣。
2) new ( number )创建一个新的date对象,作为零时间加数字。零时间是1970年1月1日00:00协调世界时。
在这个例子中,JS的时间是从1970年开始计算的。
(new Date(0)).toUTCString()
"Thu, 01 Jan 1970 00:00:00 GMT
如果你使用负数,你可以在1970年以前“倒转”它。
(new Date(-62167219200000)).toUTCString()
"Sat, 01 Jan 0 00:00:00 GMT"
-62167219200000 <- milliseconds
-62167219200000 / 1000
-62167219200 <- seconds
-62167219200 / 60
-1036120320 <- minutes
-1036120320 / 60
-17268672 <- hours
-17268672 / 24
-719528 <- days
-719528 / 365
-1971.309589041096 <- years ( this is roughly calculated value )
问题是它不可靠。有多少年的飞跃?有吗?夏令时?等。我不喜欢因为这个神奇的数字-62167219200000
3) new Date(dateString) --这是最“可靠”的方式。DateString -表示RFC2822或ISO8601日期的字符串。
RFC2822 / IETF日期语法(RFC2822第3.3节)。“1995年12月25日13:30格林尼治时间星期一”
它的问题是,如果使用负数,那么在所有方法中,使用NaN都会得到不正确的日期。
(new Date('01 January -1 00:00:00 UTC')).getFullYear()
NaN
如果您使用年份较高或等于0而低于50,则将自动添加2000年。
(new Date('01 January 0 00:00:00 UTC')).getFullYear()
2000
(new Date('01 January 1 00:00:00 UTC')).getFullYear()
2001
(new Date('01 January 10 00:00:00 UTC')).getFullYear()
2010
(new Date('01 January 01 00:00:00 UTC')).getFullYear()
2001
(new Date('01 January 30 00:00:00 UTC')).getFullYear()
2030
(new Date('01 January 49 00:00:00 UTC')).getFullYear()
2049
如果你使用年份更高或等于50,低于100,那么1900年将被添加。
(new Date('01 January 50 00:00:00 UTC')).getFullYear()
1950
(new Date('01 January 51 00:00:00 UTC')).getFullYear()
1951
(new Date('01 January 90 00:00:00 UTC')).getFullYear()
1990
(new Date('01 January 99 00:00:00 UTC')).getFullYear()
1999
等于或大于100的年份将得到正确的年数。
(new Date('01 January 100 00:00:00 UTC')).getFullYear()
100
(new Date('01 January 101 00:00:00 UTC')).getFullYear()
101
(new Date('01 January 999 00:00:00 UTC')).getFullYear()
999
(new Date('01 January 9999 00:00:00 UTC')).getFullYear()
9999
,因此我们不能使用RFC2822 / IETF日期语法创建第一年。
关于ISO 8601:
http://www.w3.org/TR/NOTE-datetime
实际格式如下
Year:
YYYY (eg 1997)
Year and month:
YYYY-MM (eg 1997-07)
Complete date:
YYYY-MM-DD (eg 1997-07-16)
Complete date plus hours and minutes:
YYYY-MM-DDThh:mmTZD (eg 1997-07-16T19:20+01:00)
Complete date plus hours, minutes and seconds:
YYYY-MM-DDThh:mm:ssTZD (eg 1997-07-16T19:20:30+01:00)
Complete date plus hours, minutes, seconds and a decimal fraction of a second
YYYY-MM-DDThh:mm:ss.sTZD (eg 1997-07-16T19:20:30.45+01:00)
我们最感兴趣的是“完全约会”
(new Date('0001-01-01')).toUTCString()
"Mon, 01 Jan 1 00:00:00 GMT"
雅虎!!(或者更好地说谷歌!: ),我们可以使用ISO 8601创建年份1的日期。
但是要小心,不要试图使用负数或短年数,因为对这些数字的解析可能会因本地化或疯狂而有所不同:)
(new Date('-0001-01-01')).toUTCString()
"Sun, 31 Dec 2000 21:00:00 GMT"
(new Date('01-01-01')).toUTCString()
"Sun, 31 Dec 2000 21:00:00 GMT"
(new Date('02-01-01')).toUTCString()
"Wed, 31 Jan 2001 21:00:00 GMT"
(new Date('02-01-05')).toUTCString()
"Mon, 31 Jan 2005 21:00:00 GMT"
4) 新日期(年、月、日、小时、分钟、秒、毫秒)
要使用这个参数,必须传递两个参数(年份和月份),所有其他参数都是可选的。小心点,因为这里的月份将从0开始到11月份,不像其他地方一样。瓦特?o_O
警告!此日期将在您当前的时区中创建!所以要小心使用它!
UPD:@matt对的澄清
...actually日期对象总是反映本地时区。您不能将它放置在另一个时区,即使您用UTC时间戳初始化它,它仍然会在大多数函数中反映回本地时区。在内部,它通过数字时间戳跟踪UTC,还有一些函数显式地公开UTC值,但其他都是本地的。
负数将被解释为负数年份。
(new Date(-1, 0)).toString()
"Fri Jan 01 -1 00:00:00 GMT+0300 (Russia TZ 2 Standard Time)"
(new Date(-234, 0)).toString()
"Wed Jan 01 -234 00:00:00 GMT+0300 (Russia TZ 2 Standard Time)"
从0到99的数字将自动增加到1900。
(new Date(0, 0)).toString()
"Mon Jan 01 1900 00:00:00 GMT+0300 (Russia TZ 2 Standard Time)"
(new Date(1, 0)).toString()
"Tue Jan 01 1901 00:00:00 GMT+0300 (Russia TZ 2 Standard Time)"
(new Date(11, 0)).toString()
"Sun Jan 01 1911 00:00:00 GMT+0300 (Russia TZ 2 Standard Time)"
(new Date(50, 0)).toString()
"Sun Jan 01 1950 00:00:00 GMT+0300 (Russia TZ 2 Standard Time)"
(new Date(99, 0)).toString()
"Fri Jan 01 1999 00:00:00 GMT+0300 (Russia TZ 2 Standard Time)"
从100到275760的数字将被解释为年份数字。
(new Date(100, 0)).toString()
"Fri Jan 01 100 00:00:00 GMT+0300 (Russia TZ 2 Standard Time)"
(new Date(102, 0)).toString()
"Sun Jan 01 102 00:00:00 GMT+0300 (Russia TZ 2 Standard Time)"
(new Date(2002, 0)).toString()
"Tue Jan 01 2002 00:00:00 GMT+0300 (Russia TZ 2 Standard Time)"
而高于275760的数字将是无效日期。
(new Date(275760, 0)).toString()
"Tue Jan 01 275760 00:00:00 GMT+0300 (Russia TZ 2 Standard Time)"
(new Date(275761, 0)).toString()
"Invalid Date"
UPD:
新日期(Date.UTC(1,1,1))与新日期(年、月、日、小时、分钟、秒、毫秒)相同的症状将更安全。因为有Date.UTC函数。
发布于 2015-04-30 12:46:53
发布于 2018-09-09 15:28:47
可以使用构造函数的字符串版本:
console.log(new Date("0001-01-01"));
https://stackoverflow.com/questions/29968116
复制相似问题