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

2022-09-03 14:07:25

我正在使用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

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

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


答案 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()已被弃用(所以我没有推荐它)。


答案 2

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