解析没有时区转换的日期

Posted

技术标签:

【中文标题】解析没有时区转换的日期【英文标题】:Parsing dates without timezone conversion 【发布时间】:2012-11-03 15:30:26 【问题描述】:

我正在使用 groovy(确切地说是遍历图形数据库的小精灵)。不幸的是,因为我使用的是 gremlin,所以我无法导入新的类。

我有一些日期值希望转换为 Unix 时间戳。它们以 UTC 格式存储为:2012-11-13 14:00:00:000

我正在使用这个 sn-p 解析它(在 groovy 中):

def newdate = new Date().parse("yyyy-M-d H:m:s:S", '2012-11-13 14:00:00:000')

问题在于它进行了时区转换,结果是:

Tue Nov 13 14:00:00 EST 2012

如果我随后使用time() 将其转换为时间戳,该时间戳将转换为UTC,然后生成时间戳。

如何让new Date() 在首次解析日期时不进行任何时区转换(并且假设日期为 UTC)?

【问题讨论】:

好吧,我想到了new Date().parse("yyyy-M-d H:m:s:S" + " Z", '2012-11-13 14:00:00:000' + ' 0000')... @vladr: groovy 控制台只是向我抛出一个错误并说它无法解析:( java.text.ParseException: Unparseable date: "2012-11-13 14:00:00:000 0000" @F21 @vladr:如果您将其更改为def newdate = new Date().parse("yyyy-M-d H:m:s:S Z", '2012-11-13 14:00:00:000' + ' UTC'),该解决方案对我有效。 #parse 是静态的 btw,所以除非 Gremlin 强迫你这样做,否则你不需要创建 Date 的实例来调用它。 @JustinPiper Gremlins 让我这么做,我发誓! :) (复制粘贴)| @F21,对不起,时区应该是' +0000',而不是' 0000' | @jahroy,我认为我给出的示例附加了时区,不是吗? :) @vladr - 抱歉...我忽略了它(有时很难在 cmets 中阅读代码)。 【参考方案1】:

在 Java 中有两种方法:

/*
 *  Add the TimeZone info to the end of the date:
 */

String dateString = "2012-11-13 14:00:00:000";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-d H:m:s:S Z");
Date theDate = sdf.parse(dateString + " UTC");

/*
 *  Use SimpleDateFormat.setTimeZone()
 */

String dateString = "2012-11-13 14:00:00:000";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-d H:m:s:S");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
Date theDate = sdf.parse(dateString);

请注意,Date.parse() 已被弃用(所以我不推荐它)。

【讨论】:

文档指出,为了解析 Z(大写)格式,您必须指定 RFC 822 时区(+XXXX 或 -XXXX)。根据相同的文档,UTC 理论上应该只能使用z(小写)格式进行解析。如果实际上parse 将两者互换处理,我不会感到惊讶,但只是为了确认(我自己无法访问 Groovy):您上面的第一个示例有效吗? 是的。这两个例子都对我有用(在我发布它们之前)。话虽如此,我也无法访问 Groovy(我从未使用过它)。这就是为什么我说:“在 Java 中有两种方法”。老实说,我真的不知道 Java 和 Groovy 之间的关系是什么。也许这个答案是无关紧要的......【参考方案2】:

我使用日历来避免时区转换。虽然我没有使用new Date(),但是结果是一样的。

String dateString = "2012-11-13 14:00:00:000";
Calendar calendar = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-d H:m:s:S");
calendar.setTime(sdf.parse(dateString));
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = calendar.getTime();

【讨论】:

【参考方案3】:

日期类 parse(String str) 已从 JDK 1.1 中弃用,请尝试支持 TimeZone 和 Locale 设置的 SimpleDateFormat 类。

【讨论】:

您正在考虑 Java 方法。 Groovy 提供了一个替换项,让您可以指定格式。

以上是关于解析没有时区转换的日期的主要内容,如果未能解决你的问题,请参考以下文章

如何将日期字符串转换为没有时区的日期对象

转换没有时区的 JSON 日期

日期和时区转换[重复]

使用 Noda Time 在时区之间转换

Python - 在特定时区设置日期时间(没有 UTC 转换)

使用 pytz 将日期时间从一个时区转换为另一个时区