将UTC日期转换为本地日期



我正在将epoch时间(UTC)转换为如下所示的格式。现在我尝试了不同的SO答案,将UTCDateUTC转换为当地时间。但我收不到当地时间。

如有任何帮助,不胜感激。

String epochTime = "1436831775043";
Date UTCDate = new Date(Long.parseLong(epochTime));
Date localDate; // How to get this?
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("h:mm a");
String result = simpleDateFormat.format(UTCDate);

而且,转换必须在没有任何外部库的帮助下完成。

Java 8

String epochTime = "1436831775043";
Instant utcInstant = new Date(Long.parseLong(epochTime)).toInstant();
ZonedDateTime there = ZonedDateTime.ofInstant(utcInstant, ZoneId.of("UTC"));
System.out.println(utcInstant);
LocalDateTime here = there.withZoneSameInstant(ZoneId.systemDefault()).toLocalDateTime();
System.out.println(here);
输出:

2015-07-13T23:56:15.043Z
2015-07-14T09:56:15.043
<标题>后想法…

我想你是在追自己的尾巴。Date只是一个容器的毫秒数,因为纪元(1970年1月1日,00:00:00 GMT)。它内部没有携带时区(AFAIK)的表示。

例如…

String epochTime = "1436831775043";
Date UTCDate = new Date(Long.parseLong(epochTime));
// Prints the "representation" of the Date
System.out.println(UTCDate);
// Local date/time format...
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy h:mm:ss a");
try {
    System.out.println("local format: " + simpleDateFormat.format(UTCDate));
    System.out.println("local Date: " + simpleDateFormat.parse(simpleDateFormat.format(UTCDate)));
} catch (ParseException ex) {
    Logger.getLogger(JavaApplication203.class.getName()).log(Level.SEVERE, null, ex);
}
// UTC date/time format
try {
    simpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
    System.out.println("utc format: " + simpleDateFormat.format(UTCDate));
    System.out.println("utc date: " + simpleDateFormat.parse(simpleDateFormat.format(UTCDate)));
} catch (ParseException ex) {
    Logger.getLogger(JavaApplication203.class.getName()).log(Level.SEVERE, null, ex);
}

输出……

Tue Jul 14 09:56:15 EST 2015
local format: 14/07/2015 9:56:15 AM
local Date: Tue Jul 14 09:56:15 EST 2015
utc format: 13/07/2015 11:56:15 PM
utc date: Tue Jul 14 09:56:15 EST 2015

如果你看一下local Dateutc date,它们是一样的,即使local formatutc format格式正确。

所以,而不是追逐你的故事试图让Date"表示"你想要的值,要么使用Java 8的时间API或JodaTime来管理时区信息或简单地将Date格式化成你想要的时区…

更进一步,如果我们这样做…

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy h:mm:ss a");
Date localDate = simpleDateFormat.parse(simpleDateFormat.format(UTCDate));
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
Date utcDate = simpleDateFormat.parse(simpleDateFormat.format(UTCDate));
System.out.println(localDate.getTime());
System.out.println(utcDate.getTime());
System.out.println(localDate.equals(utcDate));

它将打印…

1436831775000
1436831775000
true

您可以在格式化器中设置时区:

simpleDateFormat.setTimeZone(TimeZone.getDefault());

相关内容

  • 没有找到相关文章

最新更新