格式化DateTime时如何应用时区?

时间:2016-02-28 21:33:43

标签: java scala datetime timezone java-time

我的日期时间为2011-01-11 01:51:10,时区为America/Los_Angeles

我想获得此值的本地化日期时间。这就是我的工作

val formatter1: DateTimeFormatter = DateTimeFormatter.ofPattern("y-M-d H:m:s");
val m1: LocalDateTime = LocalDateTime.parse("2011-01-11 01:51:10", formatter1);
println("DateTime: " + m1.atZone(ZoneId.of("America/Los_Angeles")))

我得到的价值是

DateTime: 2011-01-11T01:51:10-08:00[America/Los_Angeles]

如何将其转换为已应用-08:00偏移的本地化日期时间而不是[America/Los_Angeles]

4 个答案:

答案 0 :(得分:3)

看起来您正在使用具有ZonedDateTime的java.time API。您应该使用它而不是LocalDateTime,因为LocalDateTime没有时区。来自文档:

  

ISO-8601日历系统中的日期没有时区,例如2007-12-03。

     

此类不存储或表示时间或时区。相反,它是日期的描述,用于生日。如果没有附加信息(如偏移或时区),它就不能代表时间线上的瞬间。

然后,ZonedDateTime docs states that

  

ISO-8601日历系统中带有时区的日期时间,例如2007-12-03T10:15:30 + 01:00欧洲/巴黎。

     

此类处理从LocalDateTime的本地时间线到Instant的即时时间线的转换。两个时间线之间的差异是UTC / Greenwich的偏移量,由ZoneOffset表示。

使用ZonedDateTime,您的代码就像:

import java.time._
import java.time.format._

val zoneId = ZoneId.of("America/Los_Angeles")
val formatter = DateTimeFormatter.ofPattern("y-M-d H:m:s").withZone(zoneId)
val zdt = ZonedDateTime.parse("2011-01-11 01:51:10", formatter)

您将在控制台看到的结果是:

zdt: java.time.ZonedDateTime = 2011-01-11T01:51:10-08:00[America/Los_Angeles]

之所以发生这种情况,是因为您使用的是default toString method of ZonedDateTime,看起来DateTimeFormatter.ISO_OFFSET_DATE_TIME正是您想要的。所以你的代码应该是:

import java.time._
import java.time.format._

val zoneId = ZoneId.of("America/Los_Angeles")
val formatter = DateTimeFormatter.ofPattern("y-M-d H:m:s").withZone(zoneId)
val zdt = ZonedDateTime.parse("2011-01-11 01:51:10", formatter)
val formatted: String = zdt.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME)

答案 1 :(得分:2)

首先必须指定您解析的时间所在的时区。然后指定另一个要转换的时区。

DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("y-M-d H:m:s");
LocalDateTime m1 = LocalDateTime.parse("2011-01-11 01:51:10", formatter1);
ZonedDateTime z1 = m1.atZone(ZoneId.of("UTC"));
ZonedDateTime z2 = z1.withZoneSameInstant(ZoneId.of("America/Los_Angeles"));

System.out.println(z2.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));

答案 2 :(得分:0)

请查看我的完整答案。 Answer

    String dateTime = "MM/dd/yyyy HH:mm:ss";
    String date = "09/17/2017 20:53:31";
    Integer gmtPSTOffset = -8;
    ZoneOffset offset = ZoneOffset.ofHours(gmtPSTOffset);

    // String to LocalDateTime
    LocalDateTime ldt = LocalDateTime.parse(date, DateTimeFormatter.ofPattern(dateTime));
    // Set the generated LocalDateTime's TimeZone. In this case I set it to UTC
    ZonedDateTime ldtUTC = ldt.atZone(ZoneOffset.UTC);
    System.out.println("UTC time with Timezone          : "+ldtUTC);

    // Convert above UTC to PST. You can pass ZoneOffset or ZoneId for 2nd parameter
    LocalDateTime ldtPST = LocalDateTime.ofInstant(ldtUTC.toInstant(), offset);
    System.out.println("PST time without offset         : "+ldtPST);

    // If you want UTC time with timezone
    ZoneId zoneId = ZoneId.of( "America/Los_Angeles" );
    ZonedDateTime zdtPST = ldtUTC.toLocalDateTime().atZone(zoneId);
    System.out.println("PST time with Offset and TimeZone   : "+zdtPST);

答案 3 :(得分:-1)

你可能想要的是获得UTC时间,然后对它应用时区偏移。 Joda时间很容易做到。例如:

DateTime.now().minus(timezoneOffset) 

其中timezoneOffset为int,表示您所在位置的时移。如果我错了,请纠正我。