java - DateFormat 格式方法不显示特定时区的解析日期

标签 java date datetime time

我通过 SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").parse(DateinString) 将日期字符串转换为 Date。
这里不是转换为 UTC,而是转换为我的本地时区。我通过 DateFormat 的 format 方法显示这个解析的日期来检查它。

所以我必须将其重新格式化回 UTC。现在,当我尝试通过相同的格式方法将此解析的日期显示为 UTC 时区时,它仍然显示在本地时区中。以下是我的代码,用于将解析的日期格式化为 UTC-

Calendar cal = Calendar.getInstance();
cal.setTimeZone(TimeZone.getTimeZone("UTC"));
cal.setTime(alreadyParsedDateTime); // 
System.out.println(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(cal.getTime()));       

我的示例日期字符串是“2015-12-23T15:00:00-0800”
解析后 --alreadyParsedDateTime.toString()::Thu Dec 24 04:30:00 IST 2015
解析后—— System.out.println(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(alreadyParsedDateTime))::2015-12-24T04:30:00

在上述将解析日期重新格式化为 UTC 之后 -- System.out.println(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(cal.getTime()))::2015-12-24T04:30:00

预期日期格式为::2015-12-23T23:00:00

我不知道为什么格式方法不能按预期方式工作,或者有什么技巧可以做到这一点。请帮忙..

最佳答案

这里有两个不同的主题;解析和格式化。

1。解析

SimpleDateFormat.parse() 将尝试从提供的日期字符串中解析时区。如果您正在解析的日期字符串不包含显式时区,则将使用 SimpleDateFormat 对象上的“默认”时区。您可以使用 setTimeZone() 方法设置默认时区。请参阅 SimpleDateFormat.parse() 的 API 文档和 DateFormat.setTimeZone()供引用。

下面的示例显示了使用 setTimeZone() 设置的时区如何影响解析:

    String dateString = "2015.12.10 13:58:18";

    SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
    sdf1.setTimeZone(TimeZone.getTimeZone("GMT"));
    Date date1 = sdf1.parse(dateString);

    SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
    sdf2.setTimeZone(TimeZone.getTimeZone("EST"));
    Date date2 = sdf2.parse(dateString);

    // Shows that the parsing honours time zone -- will print:
    // Thu Dec 10 14:58:18 CET 2015 (original date was parsed as GMT)
    // Thu Dec 10 19:58:18 CET 2015 (original date was parsed as EST)
    System.out.println(date1);
    System.out.println(date2);

2。格式设置

假设日期已被正确解析,那么您的问题在于格式。您需要为用于格式化的实际 SimpleDateFormat 对象设置时区。我修改了您的代码来执行此操作,它现在将打印您所期望的内容:

    Calendar cal = Calendar.getInstance();
    cal.setTime(alreadyParsedDateTime);
    SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
    sdf3.setTimeZone(TimeZone.getTimeZone("UTC"));

    // Prints: 2015-12-23T23:00:00 for your example date string
    System.out.println(sdf3.format(cal.getTime()));

关于java - DateFormat 格式方法不显示特定时区的解析日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34200372/

相关文章:

javascript - 如何获得两个日期对象之间的小时差?

python - Pandas Date Format 不转换日期

c# - 在 C# 中将 dd/MM/yyyy hh :mm:ss. fff 从字符串转换为 DateTime

java - 为什么java中的集合有int索引?

JAVA调用从其他包继承的类的成员(其他类类型)

javascript - 从 JavaScript 日期中删除 "(Eastern Standard Time)"

php - 无法解析日期时间类型

java - apache Camel Web 服务客户端

java - Android添加库报错

MySQL 其中 DateTime 大于今天