在Java中遇到了一个小问题:我有两个字符串,分别代表一个日期(例如“ 2019-11-10”)和一个时间(例如“ 01:23:45.123”)。将它们转换为UTC时间戳很容易,但是存在一个问题:
日期是在本地时区中给出的,例如“ America / New_York”,而时间是以UTC给出的,因此以下信息...
date = "2019-11-10"
,time="01:23:45.123"
(假设日期部分为"America/New_York"
的本地时区)
...实际上应该是UTC时间"2019-11-11 01:23:45.123"
(因为只有这是纽约日期“ 2019-11-10”)。
Java Time API或joda time是否提供任何方便的方法来进行此转换,同时还要牢记DST等详细信息?到底有没有(相对)简单的方法?
编辑:
也许这还不清楚。让我尝试从另一端进行解释:
假设我的日期时间x(以UTC为单位)为"2019-11-11 01:23:45.123"
。
然后我可以通过简单地将x转换为适当的时区并设置格式为-> "2019-11-10"
来获得日期部分y(如在“美国/纽约”中所示)。
我也可以通过简单地格式化-"01:23:45.123"
来获得时间部分z(如UTC中所示)。
现在,假设我有y和z-如何获得x?
编辑2:
我刚刚意识到,这永远不会完美。原因:
UTC“ 2019-11-04 04:01:00.000”-> US / NY:“ 2019-11-03 23:01”
UTC“ 2019-11-03 04:01:00.000”->美国/纽约州:“ 2019-11-03 00:01”
因此,如果我仅获得以下信息:“美国/纽约的日期”为“ 2019-11-03”加上“ UTC时间”为“ 04:01:00.000”,则实际上有两种可能的解决方案,而不仅仅是一种。
答案 0 :(得分:1)
您必须将日期调整为纽约时区,这可以通过选择任意时间来完成。然后通过选择任意日期将时间转换为纽约。然后可以合并这两个区域,因为它们具有相同的区域。并转换回UTC
LocalDate date = LocalDate.parse("2019-11-10");
LocalTime time = LocalTime.parse("01:23:45.123");
ZoneId zone = ZoneId.of("America/New_York");
ZonedDateTime dateInZone = date.atStartOfDay(zone);
ZonedDateTime timeInZone = time.atOffset(ZoneOffset.UTC).atDate(date).atZoneSameInstant(zone);
ZonedDateTime resultNY = dateInZone.with(timeInZone.toLocalTime());
ZonedDateTime resultUTC = resultNY.withZoneSameInstant(ZoneOffset.UTC)
System.out.println(resultUTC);
// 2019-11-11T01:23:45.123Z
答案 1 :(得分:0)
日期不能有时区。 (考虑一下。)
也许您的意思是用UTC表示的该日期的第一天。
LocalDate ld = LocalDate.parse( "2019-11-10" ) ;
ZonedDateTime zdt = ld.atStartOfDay( ZoneOffset.UTC ) ;
调整要在时区显示的那一刻。
ZoneId z = ZoneId.of( "America/New_York" ) ;
LocalTime lt = LocalTime.parse( "01:23:45.123" ) ;
ZonedDateTime zdt2 = zdt.with( lt ) ;