Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在joda中将字符串解析为datetime_Java_Datetime_Timezone_Jodatime_Datetime Parsing - Fatal编程技术网

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);