通过日期字符串获取其他时区的时间,结果错误

5

我只有一个日期字符串,想要通过它查看其他时区的时间。因此我这样做:

    String dateStr = "2014-05-15 16:14:58 PM";
    SimpleDateFormat sdf =  new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a");
    sdf.setTimeZone(TimeZone.getTimeZone("America/Denver"));
    Date date = sdf.parse(dateStr);
    System.out.println(date);

    SimpleDateFormat sdf1 =  new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a");
    System.out.println(sdf1.format(date));

这是我电脑当前的时区:

enter image description here

代码运行的结果是:

 Fri May 16 06:14:58 CST 2014

 2014-05-16 06:14:58 AM

结果是错误的,我在我的电脑上将时区更改为“America/Denver”后,得到了正确的结果,我看到:

America/Denver —— 2014-05-15 02:14:58 AM

我不知道它为什么会这样?
但是,如果我有一个日期而不是日期字符串,我会这样做:
public static String getFormatedDateString(String _timeZone) {
    TimeZone timeZone = null;
    if (StringUtils.isEmpty(_timeZone)) {
        timeZone = TimeZone.getDefault();
    } else {
        timeZone = TimeZone.getTimeZone(_timeZone);
    }

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a");
    sdf.setTimeZone(timeZone);
    // TimeZone.setDefault(timeZone);
    return sdf.format(new Date());
}

System.out.println("America/Denver -- " + getFormatedDateString("America/Denver"));

结果如下:

------Asia/Shanghai------
2014-05-15 16:32:04 PM (current date)
America/Denver —— 2014-05-15 02:32:04 AM

这个结果是正确的。

所以我很困惑,当我只有一个日期字符串并且想知道其他时区的时间时,我找不到问题。有人能帮帮我吗?

1个回答

5
  1. Java中的Date对象与时区概念无关。
  2. 您想要做的是获取一个日期字符串在另一个时区中的等效时间,该日期字符串“应该”处于您自己的时区。

然而,在您的代码中,第二个点似乎是相反的:

String dateStr = "2014-05-15 16:14:58 PM";
SimpleDateFormat sdf =  new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a");
sdf.setTimeZone(TimeZone.getTimeZone("America/Denver"));
Date date = sdf.parse(dateStr);

这4行代码的作用是将日期字符串视为“America/Denver”时区中的一个时间点。将其解析为日期对象后,它会给你在你自己时区中的等效时间。
你想要反过来:
因此,保持接近你的代码(你可以有效地使用单个SimpleDateFormat实例,稍后可以弄清楚),在第一个sdf上删除setTimezone。
String dateStr = "2014-05-15 16:14:58 PM";
SimpleDateFormat sdf =  new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a");
//sdf.setTimeZone(TimeZone.getTimeZone("America/Denver"));
Date date = sdf.parse(dateStr);
System.out.println(date);

将相同的 setTimezone 添加到另一个 sdf 中:
SimpleDateFormat sdf1 =  new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a");
sdf1.setTimeZone(TimeZone.getTimeZone("America/Denver"));
System.out.println(sdf1.format(date));

现在,您正在将日期字符串解析为当前(JVM)时区的日期。然后将相同的日期格式化为不同时区的字符串。
更改代码后,我得到的输出是(我的JVM时区为IST):
Thu May 15 16:14:58 IST 2014 // Parsed the date string in IST
2014-05-15 04:44:58 AM // Equivalent time in Denver

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