将具有不同时区的日期和时间转换为时间戳

时间:2019-11-21 09:46:34

标签: java time jodatime java-time

在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”,则实际上有两种可能的解决方案,而不仅仅是一种。

2 个答案:

答案 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 ) ;