使用JavaScript处理公元1000年前日期的提示
我很好奇,是否有人有什么好的方法可以准确地确定公元1000年之前的建筑日期,尤其是公元1-100年 例如,如果我想确定第一个千年开始的日期,我不能只做使用JavaScript处理公元1000年前日期的提示,javascript,date,Javascript,Date,我很好奇,是否有人有什么好的方法可以准确地确定公元1000年之前的建筑日期,尤其是公元1-100年 例如,如果我想确定第一个千年开始的日期,我不能只做 new Date(Date.UTC(1,0,1,0,0,0,0)); 因为它试图变得“聪明”,并假设1是1901年,这给了我 Sun Dec 31 1900 18:00:00 GMT-0600 (CST) 99年也是如此 new Date(Date.UTC(99,0,1,0,0,0,0)); 变成 Thu Dec 31 1998 18:00
new Date(Date.UTC(1,0,1,0,0,0,0));
因为它试图变得“聪明”,并假设1是1901年,这给了我
Sun Dec 31 1900 18:00:00 GMT-0600 (CST)
99年也是如此
new Date(Date.UTC(99,0,1,0,0,0,0));
变成
Thu Dec 31 1998 18:00:00 GMT-0600 (CST)
想法?创建一些任意日期
d
并调用d.setUTCFullYear(myDate)
。在Chrome的控制台中,这似乎对我有效。在日期对象创建后,您是否尝试过在其上使用
setUTCDate()
setUTCFullYear()
setUTCMonth()
setUTCHours()
setUTCMinutes()
setUTCSeconds()
其他人则提供了修复方法的提示。javascript日期对象是从Java复制的,所以它的所有bug也都是从Java复制的。1582年以前的日期没有多大意义,因为在1582年以前,其他各种日历都在使用。这是我提出的基本解决方案。如果一个日期早于1000年,我只需在构建日期时向其添加1000,然后使用
setUTCFullYear()
if (year >= 0 && year < 1000) {
var d = new Date(Date.UTC(year + 1000,mon,day,hour,min,sec,0));
d.setUTCFullYear(d.getFullYear() - 1000);
return d;
}
如果(年份>=0&&year<1000){
var d=新日期(日期UTC(年+1000,周一,日,小时,分钟,秒,0));
d、 setUTCFullYear(d.getFullYear()-1000);
返回d;
}
1000次可能太过分了,因为我只在100次约会前遇到问题。。。但是,不管怎样。这正是
Date.UTC
和Date
构造函数(以数字作为参数调用)的内容。一个简单的解决方法是使用Date.parse
,它不会应用任何更正
new Date(Date.parse('0001-01-04'));
new Date(Date.parse('0001-01-04T18:00:00Z'));
我更喜欢:
var d = new Date(Date.UTC(year, month, day, hour, min, sec, 0));
d.setUTCFullYear(year);
这始终适用于所有支持的年份值
如果你问我的话,setUTCFullYear()调用可以修复JavaScript的故意错误。你必须重新设置年份,如或。 日期可以存储1之前和之后的285616年。1.1970年
var d = new Date( 0000, 1, 29 ); // Thu Mar 01 1900 00:00:00 GMT+0100
d.setFullYear(-0004); // Wed Mar 01 -0004 00:00:00 GMT+0057
d.setFullYear( 0000, 1, 29 ); // Tue Feb 29 0000 00:00:00 GMT+0057
// Yes, year zero was a leap year
说明:
我喜欢这个。有点像是一个反千年虫。这正是当事情写得不好,事后又被黑客攻击时会发生的情况。您是否因为可能出现的时区不一致问题而使用
getFullYear()
而不是year
?例如,如果月份是-1,它可能会改变年份?只是好奇。我知道施工人员是按设计工作的。我的问题是如何避开它Date.parse()
是一个有趣的解决方案-谢谢。我需要将SAP日期字符串(“yyyymmdd”)转换为JavaScript日期。SAP使用的日期范围从0001/01/01到9999/12/31。我将年、月和日期解析为单个字符串,初始化了默认日期var date=new date(0)
并使用.setUTC…()
设置器。不要忘记月份是以0为基础的(一月=0)。此解决方案只会设置正确的年份值,而其他时间组件则是“任意”的。咧嘴笑,但说真的,根据你回答的精神,我相信你的意思是,我同意这是最干净的解决方案。哇,我完全不知道Java的日期对象自动减去1900。哎呀!1582年以前的格里高利历就是为什么会有这样一个名字:一个“proleptic”日历:我喜欢人们发布并接受自己的答案。他们不需要——他们的问题已经解决了。但这样做将有助于将来阅读该问题的其他人。如果这对你有帮助,请投票