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

Java 按日期字符串获取其他时区的时间,结果错误,java,date,datetime,timezone,Java,Date,Datetime,Timezone,我只有一个日期字符串,我想通过它查看其他时区的时间。所以我就这样做了: 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(dateS

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

    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));
这是我的计算机中的当前时区:

运行代码的结果是:

 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(“美国/丹佛--”+GetFormattedDateString(“美国/丹佛”)

结果如下:

------Asia/Shanghai------
2014-05-15 16:32:04 PM (current date)
America/Denver —— 2014-05-15 02:32:04 AM
这个结果是正确的

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

  • Java中的
    Date
    对象独立于时区的概念
  • 您要做的是获得日期字符串的另一时区中的等效时间,该日期字符串“应该”在您自己的时区中
  • 但是,第二点在代码中向后显示:

    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条线在“美国/丹佛”时区中考虑日期字符串作为时间点。 当您将其解析为date对象时,它将为您提供自己时区中的等效时间

    你想让它反过来:

    因此,要贴近代码(您只需有效地使用一个
    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