我得到时间和时间的时区与外部组件分开。 时间格式为' 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)
关于可能出现什么问题的任何想法?
答案 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");