解析日期而不进行时区转换

16

我正在使用Groovy(准确来说是Gremlin用于遍历图形数据库)进行工作。不幸的是,因为我在使用Gremlin,所以我无法导入新类。

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

我正在使用以下代码片段(在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
@vladr:Groovy控制台向我抛出了一个错误,并说它无法解析 :( java.text.ParseException: Unparseable date: "2012-11-13 14:00:00:000 0000" - F21
1
@F21 @vladr:如果你把它改成def newdate = new Date().parse("yyyy-M-d H:m:s:S Z", '2012-11-13 14:00:00:000' + ' UTC'),那么这个解决方案对我有效。顺便说一下,#parse是静态的,所以除非Gremlin强制要求,否则您不需要创建Date实例来调用它。 - Justin Piper
@JustinPiper 真的不是我的问题,是 Gremlins 的错! :) (复制粘贴的问题)| @F21,非常抱歉,时区应该是'+0000'而不是' 0000' | @jahroy,我认为我给出的示例会添加时区,你不这样认为吗? :) - vladr
@vladr - 对不起...我忽略了它(有时在评论中很难阅读代码)。 - jahroy
3个回答

20

这里有两种在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)。根据同一文档,理论上只能使用z(小写)格式来解析UTC。我不会感到惊讶,如果在实际情况下,parse将两者视为可互换使用,但只是为了确认(我自己无法访问Groovy):您上面的第一个示例是否有效? - vladr
是的。这两个例子在我发布之前都能正常工作。话虽如此,我也没有访问Groovy(我从未使用过它)。这就是为什么我说:“_以下是在Java中完成它的两种方法_”。老实说,我真的不知道Java和Groovy之间的关系。也许这个答案是无关紧要的... - jahroy

1
我使用了日历来避免时区转换。虽然我没有使用新的日期(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();

-1

从JDK 1.1开始,Date类的parse(String str)方法已被弃用,请尝试使用SimpleDateFormat类,该类还支持时区和本地设置。


你正在思考Java方法。Groovy提供了一个替代方案,使您可以指定格式。 - Justin Piper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接