Javascript日期:01/01/0001

Javascript日期:01/01/0001,javascript,date,datetime,Javascript,Date,Datetime,我想用javascript创建一个日期对象,它表示2014年前的0001年 我试过了 d = new Date(); d.setYear(1); console.log(d); 但它给出了1901年 与 不可能 如何创建此日期?使用-这是JavaScript的Y2K问题 var d=新日期();d、 一年(1); 文件编写(d)在处理JavaScript日期对象时,必须为ex、1950而不是50指定全年。文件中提到了这一点。所以代码应该像Daniel说的那样 d = new Date();

我想用javascript创建一个日期对象,它表示2014年前的0001年

我试过了

d = new Date(); d.setYear(1);
console.log(d);
但它给出了1901年

不可能

如何创建此日期?

使用-这是JavaScript的Y2K问题

var d=新日期();d、 一年(1);

文件编写(d)在处理JavaScript日期对象时,必须为ex、1950而不是50指定全年。文件中提到了这一点。所以代码应该像Daniel说的那样

d = new Date(); d.setFullYear(1);
console.log(d);

首先,这根本不是Y2K问题(更新:在某些情况下,这与Y2K问题有关,但这不是问题所在)

正确的答案是你不能可靠地做到这一点。夏令时适用于第一年吗?有多少闰年?有吗?等等,但是@Daniel的答案会用到它

更新:更不用说@MattJohnson post关于DST的内容了

所以请不要自欺欺人地认为你可以可靠地处理1970年以下的日期。(即使在这段时间内,你也会遇到很多问题和惊喜。)

但如果您确实需要,您可以使用
新日期('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 Date()创建当前日期(在您的本地时区),因此我们暂时不感兴趣


2) 新建日期(数字)创建一个新的日期对象,即零时间加上数字。零时间是1970年1月1日00:00:00 UTC

在这个例子中,时间是从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 )
如果使用年份大于或等于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:

实际格式为

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"
雅虎!!!(或者更好的说法是Google!:),我们可以使用ISO 8601创建第一年的日期

但要小心,不要尝试使用负数或短年份数,因为这些数字的解析可能会因本地化或疯狂而有所不同:)


4) 新日期(年、月、日、时、分、秒、毫秒)

要使用此参数,您必须传递两个参数(年和月),所有其他参数都是可选的。要小心,因为这里的月份从0开始到11,不像其他地方。沃特?欧欧欧

警告此日期将在当前时区中创建!!!所以小心使用它

UPD:马特·约翰逊澄清

…实际上,Date对象始终反映本地时区。您不能将它放在另一个时区,即使您使用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函数的缘故。

方法(已弃用)设置指定日期的年份,但请注意:

如果yearValue是一个介于0和99(含99)之间的数字,则年份 对于dateObj,将其设置为1900+yearValue。否则,这一年 dateObj设置为yearValue

var theBigDay = new Date();

theBigDay.setYear(96);   // sets year to 1996
theBigDay.setYear(1996); // sets year to 1996
theBigDay.setYear(2000); // sets year to 2000

尽管如此,你还是应该使用这个方法。另一种方法已弃用。

您可以使用构造函数的字符串版本:


控制台日志(新日期(“0001-01-01”)
um numeric literal
0001
1
的八进制,
1
0001
的值是相同的。这与Daniels的答案有什么不同呢?@Mathemats很好,一个登录控制台,另一个写入文档:P@Sp0T无论如何,它应该是一个评论而不是一个答案。多么复古:)扔进了一个
文档。写
也是出于怀旧的目的@RGraham我只是为了剪断而这样做。我知道,我只是认为它适合于Y2K问题。新日期(Date.UTC(1,1,1))会比新日期(年、月、日、时、分、秒、毫秒)更安全。由于Date.UTC函数…响应良好。全面准确。不过有一点需要澄清,当您调用它将在本地时区中创建日期时,实际上
date
对象始终反映本地时区。您不能将它放在另一个时区,即使您使用UTC时间戳初始化它,它仍然会在大多数函数中反映出本地时区。在内部,它通过数字时间戳跟踪UTC,有些函数显式地公开UTC值,但其他所有内容都是本地的。不,它们不是,或者我们不能确定。当时(或没有)还有其他各种各样的日历系统。1582年,分阶段投入慢慢开始。JS(和大多数其他人)使用ISO-8601日历,这是一种前公历。这意味着它的行为就好像这个日历一直在生效,即使我们清楚地知道它不是。换句话说,JavaScript的“第一年”是我们几年前的2014年,但它与当时使用的其他日历上的“第一年”不同。你是这样说的吗:
(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)"
(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"
var theBigDay = new Date();

theBigDay.setYear(96);   // sets year to 1996
theBigDay.setYear(1996); // sets year to 1996
theBigDay.setYear(2000); // sets year to 2000