解析没有时区转换的日期
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 提供了一个替换项,让您可以指定格式。以上是关于解析没有时区转换的日期的主要内容,如果未能解决你的问题,请参考以下文章