日期和时区转换

时间:2018-11-26 07:00:25

标签: java date timezone

如何在Java中将"E MMM dd HH:mm:ss z yyyy"(字符串类型)转换为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对象相同。

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分: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();
}

答案 2 :(得分: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以来,有了一个新的time-API(请参阅package java.time),该API具有许多旧的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