Java时区格式问题

时间:2018-02-20 11:17:20

标签: java timezone simpledateformat datetime-format timezone-offset

应用程序中保存的时间是UTC。应用程序的用户位于不同的时区,例如PST,IST等。

我的问题与this post中的问题非常相似。 我尝试在那里实现一个解决方案,但它似乎对我不起作用:

Calendar calendar = Calendar.getInstance();
calendar.setTime(history.getCreatedTimestamp());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

//Here you say to java the initial timezone. This is the secret
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
//Will print in UTC
System.out.println(sdf.format(calendar.getTime()));

//Here you set to your timezone
sdf.setTimeZone(TimeZone.getDefault());
//Will print on your default Timezone
System.out.println(sdf.format(calendar.getTime()));

1 个答案:

答案 0 :(得分:3)

我建议您使用Java 8类(SimpleDateFormatCalendar are trouble,如果可能请避免使用它们:

long timestamp = history.getCreatedTimestamp();
// create Instant from timestamp value
Instant instant = Instant.ofEpochMilli(timestamp);

// formatter
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

// convert to UTC
System.out.println(formatter.format(instant.atZone(ZoneOffset.UTC)));

// convert to another timezone
System.out.println(formatter.format(instant.atZone(ZoneId.of("America/Los_Angeles"))));

// convert to JVM default timezone
System.out.println(formatter.format(instant.atZone(ZoneId.systemDefault())));

不幸的是,像PST和IST这样的短区域名称不明确(检查this list),因此您需要将它们翻译为IANA's names(这是Java使用的标准,例如America/Los_Angeles }或Europe/London)。

有关时区的更多信息:https://codeofmatt.com/2015/02/07/what-is-a-time-zone