将datetime从一个区域转换为另一个区域

时间:2014-12-30 10:36:14

标签: java jodatime

这是我之前question之一的延续,我无法解析现在解决的日期。在下面的代码中,我有一个日期字符串,我知道日期字符串的时区,即使字符串本身不包含它。然后我需要将日期转换为EST时区。

        String clientTimeZone = "CST6CDT";
        String value = "Dec 29 2014 11:36PM";
        value=StringUtils.replace(value, "  ", " ");
         DateTimeFormatter df = DateTimeFormat.forPattern("MMM dd yyyy hh:mma").withZone(DateTimeZone.forID(clientTimeZone));
                DateTime temp = df.parseDateTime(value);
                System.out.println(temp.getZone().getID());
                Timestamp ts1 = new Timestamp(temp.getMillis());
                DateTime date = temp.withZoneRetainFields(DateTimeZone.forID("EST"));//withZone(DateTimeZone.forID("EST"));
                Timestamp ts = new Timestamp(date.getMillis());
System.out.println(ts1+"="+ts);

当我运行代码时,我希望ts1保持相同,并且ts将增加1小时。但我已经低于我不明白的地方了。我认为EST比CST提前一小时,所以如果它在CST中是11,那么它应该是美国东部时间的12。似乎也有大约十一个半小时的抵消。关于我所缺少的任何线索。

2014-12-30 11:06:00.0=2014-12-30 10:06:00.0

2 个答案:

答案 0 :(得分:0)

我认为以下代码可以帮助您。

      String clientTimeZone = "CST6CDT";
      String toStimeZone = "EST";
      String value = "Dec 29 2014 11:36PM";
      TimeZone fromTimeZone = TimeZone.getTimeZone(clientTimeZone);
      TimeZone toTimeZone = TimeZone.getTimeZone(toStimeZone);
      Calendar calendar = Calendar.getInstance();
      calendar.setTimeZone(fromTimeZone);
      SimpleDateFormat sf = new SimpleDateFormat("MMM dd yyyy KK:mma");
      Date date = sf.parse(value);
      calendar.setTime(date);
      System.out.println(date);
      calendar.add(Calendar.MILLISECOND, fromTimeZone.getRawOffset() * -1);
      if (fromTimeZone.inDaylightTime(calendar.getTime())) {
          calendar.add(Calendar.MILLISECOND, calendar.getTimeZone().getDSTSavings() * -1);
          }
      calendar.add(Calendar.MILLISECOND, toTimeZone.getRawOffset());
      if (toTimeZone.inDaylightTime(calendar.getTime())) {
      calendar.add(Calendar.MILLISECOND, toTimeZone.getDSTSavings());
      }
      System.out.println(calendar.getTime());

复制自:http://singztechmusings.wordpress.com/2011/06/23/java-timezone-correctionconversion-with-daylight-savings-time-settings/

答案 1 :(得分:0)

方法withZoneRetainFields()保留时区CST(= UTC-06)中的字段,因此您的本地时间戳(为LocalDateTime),但将其与不同的时区(EST = UTC-05)组合在一起在偏移中提前一小时,导致不同的瞬间。你应该这样解释它:与芝加哥相比,在纽约一小时前发生同样的当地时间。

规则是减去正偏移并添加负偏移,以使时刻的时间戳表示具有可比性(标准化为UTC偏移)。

另外:也许你不想要这个,但想要保留即时而不是本地字段。在这种情况下,您必须使用方法withZone()

旁注:有效地,您比较变量tempdate所代表的瞬间,最后使用您的默认时区在JDBC-escape-中打印这些瞬间 - 格式(解释 - 您隐式使用Timestamp.toString())。我宁愿建议为此目的使用专用的即时格式化程序或更简单(使焦点具有焦点):

System.out.println(temp.toInstant() + " = " + date.toInstant());