Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用JavaScript处理公元1000年前日期的提示_Javascript_Date - Fatal编程技术网

使用JavaScript处理公元1000年前日期的提示

使用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

我很好奇,是否有人有什么好的方法可以准确地确定公元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: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
说明:

  • 新日期(年[4位数字,0-99映射到1900-1999],月[0-11],日[1],小时,分钟,秒,毫秒);与Date.UTC相同,但在本地时区
  • 小时、分钟和秒将自动填充为零
  • 默认情况下,低于1900的年份转换为1900
  • 1900年不是闰年,所以它被移到下一个最近的第1天。三月
  • 因此,我们必须再次将年份设置为0 0000(在这种情况下,年份必须至少为4位数字)、月份和日期。我们使用setFullYear()方法,并为月份和日期提供可选参数;那么如果这一年是闰年,它就不会改变

  • 我喜欢这个。有点像是一个反千年虫。这正是当事情写得不好,事后又被黑客攻击时会发生的情况。您是否因为可能出现的时区不一致问题而使用
    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”日历:我喜欢人们发布并接受自己的答案。他们不需要——他们的问题已经解决了。但这样做将有助于将来阅读该问题的其他人。如果这对你有帮助,请投票