localdate 年月转换_如何将unix时间戳转换为LocalDate(时间)而不进行转换

我正在使用org.joda.time.LocalDate和LocalDateTime。从外部源我得到一个Unix时间戳,并希望从中获取一个LocalDate(时间)。关键是,它在该外部系统的接口中定义,所有日期/时间都是UTC时区。所以我想避免从该时间戳到本地系统的任何默认时区的任何隐式转换,这可能与UTC不同。对于这样的事情,有一个LocalDateTime的构造函数,所以我尝试了(作为一个例子):

System.out.println(new LocalDateTime(3600000L));

--> 1970-01-01T02:00:00.000

System.out.println(new LocalDateTime(3600000L, DateTimeZone.UTC));

--> 1970-01-01T01:00:00.000

结果令我感到惊讶。看一下JavaDoc,第一个构造函数使用默认区域中的ISO年表来评估时间戳""根据定义,Unix时间戳是01-JAN-1970T00:00:00UTC的秒数(此处为毫秒)!因此,如果将值3600000(=以毫安为准2小时)添加到该基数,则将在01-JAN-1970T02:00:00UTC中进行。我的本地系统设置为时区Europe / Berlin(CET),即UTC + 1。确切地说,我们现在有夏令时,所以它甚至应该是UTC + 2,但我们现在假装我们在UTC + 1。因此,如果时间戳是按UTC定义的,那么我希望结果时间是01:00:00,如果它将时间戳的值解释为CET中转换为UTC,或者03:00:00 if它正确地期望时间戳具有转换为CET的UTC值。但它实际上显示了一个未转换的时间戳,距离基地只有2个小时。

第二个构造函数应该使用指定区域中的ISO年表来评估时间戳。" (来自JavaDoc)因此,如果我明确指定UTC时区,我根本不会期望任何转换,但是时间是02:00:00。基于UTC的时间戳导致其自身被声明为UTC的时间应该产生确切的结果,但结果是01:00:00!为了仔细检查,我明确地用CET打电话给它,并得到了相同的结果,好像我没有提供任何时区。

所以看起来,时间戳不被认为是UTC,而是在本地时区。创建LocalDateTime将获取它并应用从本地时区到目标时区的转换(构造函数的第二个参数)。首先,我想知道,如果这真的没问题。其次,我必须保证我的代码中没有发生这种转换。所以我可以相信,留下第二个参数并使用默认时区就可以了,但是有保证吗?或者,如果我们改变夏令时,可能会发生一些奇怪的转换?即使更改本地时区也不会产生任何后果,这就是为什么我们从外部系统获取的时间戳已经转换为UTC的原因。

我观察到的一个邪恶场景是,时间戳应该只是一个日期(没有时间)。在这种情况下,时间戳将是时间设置为00:00:00的任何日期。当我使用LocalDate时,就像我在上面的例子中使用LocalDateTime一样,它将时间戳转换为日期+时间(当然),并简单地减少时间。但是,如果日期是15-JUL-2014T00:00:00UTC,并且我的结果在我的另一个例子中移动了相同的一小时,那么转到14-JUL-2014T23:00:00并且随后转到日期14-JUL-2014!这实际上是一场灾难,绝不可能发生!

那么你们中的任何人都有一个线索,为什么LocalDate(时间)表现得那样?或者我可能误解的背后的概念是什么。或者如何保证不发生转换?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值