Java 在joda中将字符串解析为datetime
我对这个解析很着迷。 代码如下:Java 在joda中将字符串解析为datetime,java,datetime,timezone,jodatime,datetime-parsing,Java,Datetime,Timezone,Jodatime,Datetime Parsing,我对这个解析很着迷。 代码如下: try { String if_modified_since = "Sat Sep 23 23:08:37 CST 2017"; DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("EEE MMM dd HH:mm:ss zzz yyyy"); DateTime dt_if_modified_since = DateTime.parse(if_modified
try {
String if_modified_since = "Sat Sep 23 23:08:37 CST 2017";
DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("EEE MMM dd HH:mm:ss zzz yyyy");
DateTime dt_if_modified_since = DateTime.parse(if_modified_since, dateTimeFormatter);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
错误消息是:
java.lang.IllegalArgumentException:无效格式:“2017年9月23日星期六23:08:37 CST”
我试过:
dateTimeFormatter.withLocale(Locale.US);
它不起作用。
如何修复它?我刚刚测试了您的代码,它可以正确编译和运行。我使用的是jodatime 1.0.3 确保您拥有您的“包含”权限:
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
JodaTime似乎期望工作日只有两个字母(如果使用EEE);如果我使用此选项,您的代码对我有效:
String if_modified_since = "Sa Sep 23 23:08:37 CST 2017";
(版本:Joda time 2.9.9)我正在使用Joda time 2.9.9,您的代码运行良好(“CST”被解析为
美国/芝加哥
时区)。但是,对于所有版本和时区,甚至我得到的结果都是有争议的,因为芝加哥现在是夏令时,所以它应该是“CDT”(甚至是关于z
模式的说法:时区名称('z')无法解析)
这是因为短时区名称(如“CST”和“EST”)是可用的。“CST”可以是,和。在某些API中,一些名称映射到任意默认值,但不能保证对所有名称都有效
即使我们只考虑我们的CST,也有不止一个区域(不止一个时区)使用它。唯一明确的名称是(始终采用地区/城市
格式,如美国/芝加哥
或欧洲/柏林
),您应该尽可能使用这些名称
考虑到您的输入(Sat Sep 23:08:37 CST 2017
)和您发布问题的时间(以及目前美国中部地区处于夏令时的事实),我猜测该输入指的是中国(但我可能错了,因此您必须验证该输入是在哪个时区生成的)
无论如何,如果您任意选择与“CST”对应的时区,并使用org.joda.time.format.DateTimeFormatterBuilder
创建格式化程序,则可以解析此字符串。我还使用java.util.Locale
将语言设置为英语(解析月份和星期几)。如果不指定区域设置,它将使用JVM默认值,并且不能保证始终为英语:
String if_modified_since = "Sat Sep 23 23:08:37 CST 2017";
// map of my arbritrary choices for timezones
Map<String, DateTimeZone> preferredZones = new HashMap<String, DateTimeZone>();
// CST maps to a Chinese timezone
preferredZones.put("CST", DateTimeZone.forID("Asia/Shanghai"));
DateTimeFormatter fmt = new DateTimeFormatterBuilder()
// date/time
.appendPattern("EEE MMM dd HH:mm:ss ")
// zone name - use my map of arbitrary choices
.appendTimeZoneShortName(preferredZones)
// year
.appendPattern(" yyyy")
// create formatter with English locale
.toFormatter().withLocale(Locale.US);
DateTime dt = DateTime.parse(if_modified_since, fmt);
请注意,我不需要说“CST是亚洲/上海”。API查找短名称(CST),并使用Set
作为参考(因此选择Asia/Shanghai
)
String if_modified_since = "Sat Sep 23 23:08:37 CST 2017";
// set of preferred zones
Set<ZoneId> preferredZones = new HashSet<ZoneId>();
// my arbitrary choice for CST
preferredZones.add(ZoneId.of("Asia/Shanghai"));
DateTimeFormatter fmt = new DateTimeFormatterBuilder()
// date/time
.appendPattern("EEE MMM dd HH:mm:ss ")
// zone name - use my arbitrary choices
.appendZoneText(TextStyle.SHORT, preferredZones)
// year
.appendPattern(" yyyy")
// create formatter with English locale
.toFormatter(Locale.US);
ZonedDateTime z = ZonedDateTime.parse(if_modified_since, fmt);