4

即使有大约 15 年的 Java 经验,人们总是会在处理日期和时间的话题上磕磕绊绊......

情况如下:我从某个外部系统获得时间戳作为String表示。时间戳的语义是它代表一个 UTC 日期。这个时间戳必须放在一个实体中,然后放在一个TIMESTAMP字段中的 PostgreSQL 数据库中。此外,我需要将与本地时间(在我的情况下为 CEST)相同的时间戳放入实体中,然后放入TIMESTAMP WITH TIME ZONE字段中的数据库中。

什么是正确的方法来确保无论执行代码的机器的设置是什么,时间戳都正确存储在实体中(以使用其他 UTC 时间戳进行一些验证)和数据库中(稍后在报告中使用它们上)?

这是代码,在我的本地机器上运行良好:

SimpleDateFormat sdfUTC = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
sdfUTC.setTimeZone(TimeZone.getTimeZone("UTC"));
Date utcTimestamp = sdfUTC.parse(utcTimestampString);
// getMachinesTimezone is some internal util method giving the TimeZone object of the machines Location
Calendar localTimestamp = new GregorianCalendar(getMachinesTimezone());
localTimestamp.setTimeInMillis(utcTimestamp.getTime());

但是在服务器上执行相同的代码时,会导致不同的时间,所以我认为这不是正确的处理方式。有什么建议么?

PS:我在这个论坛上搜索时读到了 Joda Time,但是在给定的项目中我无法引入新的库,因为我只更改了现有的模块,所以我必须使用标准的 JDK1.6

4

3 回答 3

6

如果我理解正确,您需要在您正在打印的同一数据/日历对象上设置时区。像这样:

private Locale locale = Locale.US;
private static final String[] tzStrings = {
    "America/New_York",
    "America/Chicago",
    "America/Denver",
    "America/Los_Angeles",
};

  Date now = new Date();
  for ( TimeZone z : zones) {
        DateFormat df = new SimpleDateFormat("K:mm a,z", locale);
        df.setTimeZone(z);
        String result = df.format(now);
        System.out.println(result); 
  }

如果我将时区设置为 SimpleDateFormat 它工作正常。

这是示例代码...

String date="05/19/2008 04:30 AM (EST)";
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy hh:mm aaa (z)");
TimeZone.setDefault(TimeZone.getTimeZone("PST"));
long millis = sdf.parse(date).getTime();
sdf.setTimeZone(TimeZone.getDefault());
System.out.println(sdf.format(new Date(millis)));
于 2012-05-11T05:22:14.693 回答
0

我认为您必须在 Calendar 对象中设置目标时区。我认为是这样的:

Calendar localTimestamp = new GregorianCalendar(TimeZone.getTimeZone("GMT+10"));
localTimestamp.setTimeInMillis(utcTimestamp.getTime());

在其他情况下,Java 采用日历实例的默认系统时区。

于 2012-05-11T05:13:47.373 回答
-1

您可以通过以下示例代码来完成。

Date date = new Date();

DateFormat formatter = new SimpleDateFormat("dd MMM yyyy HH:mm:ss z");
formatter.setTimeZone(TimeZone.getTimeZone("CET"));

Date date1 = dateformat.parse(formatter.format(date));

// Set the formatter to use a different timezone
formatter.setTimeZone(TimeZone.getTimeZone("IST"));

Date date2 = dateformat.parse(formatter.format(date)); 
// Prints the date in the IST timezone
//    System.out.println(formatter.format(date));
于 2012-05-11T05:42:08.110 回答