时间戳偏差Java与JavaScript的旧日期(3600secs)

将字符串日期表示形式转换为数值时,我在Java / Groovy / PHP和Javascript中获得了不同的结果。 对于1970年以前的某些日期,JS时间戳在Java时间戳之前恰好是3600秒。 我可以在10月1日复制它,但1月1日没关系。

我的测试用例(在groovy中,故意使用常用的Java API):

def sdf = new SimpleDateFormat("dd/MM/yyyy")
["01/10/1956", "01/01/1956", "01/10/1978"].each {
    def d = sdf.parse(it)
    println "${it} -> ${d.time}"
}

和在JS中(我只是从Chrome控制台运行它 - “9”是10月在这里):

new Date(1956, 9, 1, 0, 0, 0).getTime()

一些样品:

* Groovy的

  • 01/10/1956 - > -418179600000
  • 01/01/1956 - > -441853200000
  • 01/10/1978 - > 276040800000
  • *使用Javascript

  • 1956,9,1,0,0,0 - > -418183200000
  • 1956,0,1,0,0,0 - > -441853200000
  • 1978,9,1,0,0,0 - > 276040800000
  • =>注意01/10/1956如何不以相同的方式转换,产生3600秒的差异。

    夏令时或时区将是完美的罪魁祸首,但我不明白为什么这两个宇宙在过去的某个时候会发生分歧。

    任何提示欢迎!

    谢谢

    编辑更多样本

    *的Java / Groovy的

    01/01/1974 -> 126226800000
    01/10/1974 -> 149814000000
    01/01/1976 -> 189298800000
    01/10/1976 -> 212972400000
    01/01/1978 -> 252457200000
    01/10/1978 -> 276040800000    
    

    * JS

    new Date(1974, 0, 1, 0, 0, 0).getTime()    126226800000
    new Date(1974, 9, 1, 0, 0, 0).getTime()    149814000000
    new Date(1976, 0, 1, 0, 0, 0).getTime()    189298800000
    new Date(1976, 9, 1, 0, 0, 0).getTime()    212972400000
    new Date(1978, 0, 1, 0, 0, 0).getTime()    252457200000
    new Date(1978, 9, 1, 0, 0, 0).getTime()    276040800000
    

    1967年左右〜1971年左右

    01/01/1967 -> -94698000000
    01/04/1967 -> -86922000000
    01/10/1967 -> -71110800000    
    01/01/1968 -> -63162000000
    01/04/1968 -> -55299600000
    01/10/1968 -> -39488400000
    01/01/1971 -> 31532400000
    01/10/1971 -> 55119600000
    
    new Date(1967, 0, 1, 0, 0, 0).getTime()   -94698000000
    new Date(1967, 3, 1, 0, 0, 0).getTime()   -86925600000
    new Date(1967, 9, 1, 0, 0, 0).getTime()   -71114400000
    new Date(1968, 0, 1, 0, 0, 0).getTime()   -63162000000
    new Date(1968, 3, 1, 0, 0, 0).getTime()   -55303200000
    new Date(1968, 9, 1, 0, 0, 0).getTime()   -39492000000
    new Date(1971, 0, 1, 0, 0, 0).getTime()   31532400000   
    new Date(1971, 9, 1, 0, 0, 0).getTime()   55119600000   
    

    你的个人资料说你来自比利时。

    布鲁塞尔1976年没有夏令时:

    http://www.timeanddate.com/worldclock/clockchange.html?n=48&year=1976

    但从1977年开始,

    http://www.timeanddate.com/worldclock/clockchange.html?n=48&year=1977

    Java可能意识到这一点,而JavaScript不是。


    关于时区的信息非常复杂,您会惊奇地发现a)它们发生了变化,b)它们不准确。

    我也会在Java / Groovy中尝试这一点。

    new Date(1956, 9, 1, 0, 0, 0).getTime()
    

    一个很酷的时区网站。 http://www.bbc.co.uk/news/world-12849630

    例如,时代是1970/01/01 00:00 UTC。 不是欧洲/伦敦,因为尽管是冬天,但英国是在BST(英国夏令时),这只发生在1968年2月至1971年11月。:P http://www.timeanddate.com/time/uk/time-zone -background.html

    你越了解时间和日期,你越是意识到它所有的东西都是特别的。 即使UTC不是首字母缩写词,它的意思是英语中的“协调世界时”和法语中的“Temps UniverselCoordonné”,并且因为他们无法就缩写词达成一致,所以妥协不是UTC。 http://en.wikipedia.org/wiki/Coordinated_Universal_Time

    链接地址: http://www.djcxy.com/p/3105.html

    上一篇: Timestamp deviation Java vs Javascript for old dates (3600secs)

    下一篇: f:convertDateTime displays wrong Date if timezone is provided by a bean