日期和时区转换[重复]

问题描述 投票:0回答:3

这个问题在这里已有答案:

如何在Java中将"E MMM dd HH:mm:ss z yyyy"(String类型)转换为Date对象?我尝试过解析,但它提供了一个字符串输出。

DateFormat dfNy1 = new SimpleDateFormat("E MMM dd HH:mm:ss z yyyy", Locale.ROOT);
dfNy1.setTimeZone(TimeZone.getTimeZone("EST"));

final DateFormat df = new SimpleDateFormat("E MMM dd HH:mm:ss z yyyy", Locale.ROOT);
        df.setTimeZone(TimeZone.getTimeZone("UTC"));

System.out.println(df.format(dfNy1.parse("Thu Dec 13 00:00:00 EST 2018")));

输出:Thu Dec 13 05:00:00 UTC 2018

我以String格式获取输出,但我需要与Date对象相同。

java date timezone
3个回答
1
投票

SimpleDateFormatter类的Format方法具有StringBuffer的返回类型,因此如果要格式化日期,它将始终返回字符串。

您可以阅读相同的java文档。 https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

当您将日期从一个模式格式化为另一个日期对象时,该字符串仍将保持不变。那么为什么要将对象转换为日期?


0
投票

请不要再次格式化日期,它将以字符串格式返回。

DateFormat dfNy1 = new SimpleDateFormat("E MMM dd HH:mm:ss z yyyy", Locale.ROOT);
dfNy1.setTimeZone(TimeZone.getTimeZone("EST"));

try {
        Date d = dfNy1.parse("Thu Dec 13 00:00:00 EST 2018");
        System.out.println(s);`enter code here`
} catch (ParseException e1) {
 e1.printStackTrace();
}

0
投票

正如您已经发现的那样,您已经可以成功地将String值解析为Date对象:

DateFormat df = new SimpleDateFormat("E MMM dd HH:mm:ss z yyyy", Locale.ROOT);
Date date = df.parse("Thu Dec 13 00:00:00 EST 2018");

但是,由于Date对象是“即时”,它不包含任何时区信息;它只不过是毫秒的容器,这意味着在解析时区信息后会丢失。见Java API doc for Date

Date类表示特定的瞬间时间,精度为毫秒

幸运的是,自Java 8以来,有一个新的时间API(参见package java.time),它具有旧DateCalendar API中缺少的许多功能。

要将String值解析为包含时区的全功能日期/时间对象,请立即使用java.time.format.DateTimeFormatter

DateTimeFormatter format = DateTimeFormatter.ofPattern("E MMM dd HH:mm:ss z yyyy", Locale.ROOT);
ZonedDateTime time = ZonedDateTime.parse("Thu Dec 13 00:00:00 EST 2018", dtf);

现在您可以直接使用此java.time.ZonedDateTime,或将其转换为任何其他时区,保留“即时”:

ZonedDateTime gmtTime = time.withZoneSameInstant(ZoneId.of("GMT");

如果您只对当地时间感兴趣(跳过时区信息),请将其转换为LocalDateTime

LocalDateTime localTime = zdt.toLocalDateTime();
LocalDateTime localGmtTime = gmtTime.toLocalDateTime();

有关如何使用新API的更多信息,请查看此Tutorial about the Java time API

© www.soinside.com 2019 - 2024. All rights reserved.