0

我需要使用以下方法将我得到的 UTC 时间字符串转换为本地时间,

String dateCreate = "2013-07-01T04:37:14.771468Z"

DateFormat dfParse = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss'Z'");
dfParse.setTimeZone(TimeZone.getTimeZone("UTC"));
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
df.setTimeZone(TimeZone.getTimeZone("Asia/Colombo"));
java.util.Date dateTime;
dateTime = dfParse.parse(dateCreate);
String dteCreate = df.format(dateTime);

有人可以给我一个解决方案吗?:)

4

2 回答 2

6

编辑:既然我已经检查过它很容易支持这一点,我强烈建议您使用Joda Time。它的 ISO-8601 解析器工作正常:

String dateCreate = "2013-07-01T04:37:14.771468Z";
DateTimeFormatter formatter = ISODateTimeFormat.dateTime();
DateTime parsed = formatter.parseDateTime(dateCreate);

默认情况下,它将转换为系统默认时区,但您可以通过调用 on 更改该行为DateTimeFormatter

Joda Time 也是一个内置 API 更简洁的 API - 您会发现任何日期/时间代码都更易于编写和阅读。


查看您的输入数据和您的模式:

String dateCreate = "2013-07-01T04:37:14.771468Z";

DateFormat dfParse = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss'Z'");

他们根本不匹配。你需要类似的东西

// Don't use this directly!
DateFormat dfParse = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSS'Z'");
dfParse.setTimeZone(TimeZone.getTimeZone("UTC"));

或者:

// Don't use this directly!
DateFormat dfParse = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSSX");

后者将应对任何 ISO-8601 时区;前者仅限于 UTC。

不幸的是,上面的结果会以错误的毫秒数结束,因为所有微秒都会变成毫秒。我不知道在 Java 中避免这种情况的方法......您可能需要先修剪字符串。例如:

// Remove the sub-millisecond part, assuming it's three digits:
int firstPartLength = "yyyy-MM-ddTHH:mm:ss.SSS".length();
String noMicros = dateCreate.substring(0, firstPartLength) +
                  dateCreate.substring(firstPartLength + 3);
// Now we've got text without micros, so create an appropriate pattern
DateFormat dfParse = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX");
Date date = dfParse.parse(noMicros);

或者,如果你知道它总是以“Z”结尾:

int firstPartLength = "yyyy-MM-ddTHH:mm:ss.SSS".length();
String noMicros = dateCreate.substring(0, firstPartLength);
DateFormat dfParse = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
dfParse.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = dfParse.parse(noMicros);

这很烦人,如果能够告诉 Java 将点之后的任何数字视为“秒的分数”,那就太好了,但我不知道使用SimpleDateFormat. 请注意,无论如何您都无法表示亚毫秒值Date

于 2013-07-03T05:57:20.560 回答
2

这是 xsd 日期时间格式。您应该为此使用 javax.xml.bind.DatatypeConverter

Calendar c = DatatypeConverter.parseDateTime(lexicalXSDDateTime);

请注意,对于 SmipleDateFormatS表示毫秒数,因此它将 771468 解析为 771468 毫秒而不是 0.771468 秒,这会给结果日期增加额外的 771 秒

格式化部分没问题

于 2013-07-03T06:03:02.663 回答