将datetime转换为其他时区

时间:2014-12-29 14:53:58

标签: java jodatime

我得到时间和时间的时区与外部组件分开。 时间格式为' MMM dd yyyy hh:mma'。例如:2014年10月31日下午12:54,这个时间的时区是单独收到的。

在保存到数据库之前,我需要将此时间标准化为EST时区。我试过Calendar(我不认为这可以用java Date完成),但是输出有很多不一致的地方,然后经过一些谷歌搜索后,认为Joda有更好的支持并切换到它。但我得到以下例外。

    String clientTimeZone = "America/New_York";
    String value = "Nov 25 2014  2:18PM";
     DateTimeFormatter df = DateTimeFormat.forPattern("MMM dd yyyy hh:mma");//.withLocale(Locale.ENGLISH);
            DateTime temp = df.withZone(DateTimeZone.forID(clientTimeZone)).withOffsetParsed().parseDateTime(value);
            DateTime date = temp.withZone(DateTimeZone.forID("America/New_York"));
            Timestamp ts = new Timestamp(date.getMillis());
            Date d = new Date(ts.getTime());
            System.out.println(d.toString());

我得到了:

java.lang.IllegalArgumentException:格式无效:" 2014年11月25日下午2:18"在" 2:18 PM"     at org.joda.time.format.DateTimeFormatter.parseDateTime(DateTimeFormatter.java:899)     在LearnJoda.main(LearnJoda.java:34)

关于可能出现什么问题的任何想法?

1 个答案:

答案 0 :(得分:1)

编辑:在OP的更多信息后,答案略有变化。

您可以使用以下模式(您定义的模式)。

"MMM dd yyyy hh:mma"

但是,由于输入字符串的变化取决于它是2位数小时还是1位小时,我建议您使用String.replace方法预处理值(如此{{3 }})。

@Test
public void test() throws JsonProcessingException {
    final String value1 = "Nov 24 2014  2:40PM"; // Double space
    final String value2 = "Nov 24 2014 11:40PM"; // Single space

    // Set up a test time zone
    final ZoneId clientTimeZone = ZoneId.systemDefault();

    // Create the formatter (as previously)
    DateTimeFormatter df = DateTimeFormat.forPattern("MMM dd yyyy hh:mma");


    DateTime temp1 = 
        df.withZone(DateTimeZone.forTimeZone(TimeZone.getTimeZone(clientTimeZone)))
               .withOffsetParsed()
               .parseDateTime(value1.replace("  ", " ")); // replace double space with single space

    DateTime temp2 = 
        df.withZone(DateTimeZone.forTimeZone(TimeZone.getTimeZone(clientTimeZone)))
                .withOffsetParsed()
                .parseDateTime(value2.replace("  ", " ")); // always replace to be sre

    DateTime date1 = temp1.toDateTime(DateTimeZone.forTimeZone(TimeZone.getTimeZone("America/New_York")));
    DateTime date2 = temp2.toDateTime(DateTimeZone.forTimeZone(TimeZone.getTimeZone("America/New_York")));
    Timestamp ts1 = new Timestamp(date1.getMillis());
    Timestamp ts2 = new Timestamp(date2.getMillis());
}

如果您使用的是Java 8,也可以跳过Joda,而是使用java.time包中的 new Java 8时间和日期函数。 E.g。

DateTimeFormatter df = DateTimeFormatter.ofPattern("MMM dd yyyy h:ma");