使用SimpleDateFormat时,未知的模式字符'x'

时间:2017-06-16 11:42:57

标签: java android simpledateformat android-date

我正在尝试使用DateString格式化为SimpleDateFormat,而使用的模式就是这个

  

“YYYY-MM-dd'T'HH:MM:ss.SSSxxx”

但到达此行时

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSxxx");

我得到以下例外:

  

java.lang.IllegalArgumentException:未知的模式字符'x'at   java.text.SimpleDateFormat.validatePatternCharacter(SimpleDateFormat.java:323)   在   java.text.SimpleDateFormat.validatePattern(SimpleDateFormat.java:312)   在java.text.SimpleDateFormat。(SimpleDateFormat.java:365)at   java.text.SimpleDateFormat中。(SimpleDateFormat.java:258)

我想要实现的格式是 “的 2017-06-16T12:19:59.001 + 02:00

根据documentation这种模式应该有效 怎么了?

修改 为了澄清,我尝试使用xxx和XXX

如果是XXX,我会得到java.lang.IllegalArgumentException:未知的模式字符'X'

4 个答案:

答案 0 :(得分:15)

请参阅下面的更新。

不幸的是,关于大写X,文档[在问题和答案时]是错误的。由于documentation似乎有关于xX的{​​{3}},我现在就在这里说明,X(大写)支持(从API级别1开始),但根本没有提到x(小写)。 changed significantly也未提及X

docs used to的检查(请参阅validateFormat())显示该版本中只识别字母GyMdkHmsSEDFwWahKzZLc,尽管文档声称自API以来X已得到支持级别1.这解释了为什么你得到IllegalArgumentException: Unknown pattern character 'X'

有关历史详情,请参阅Android source code

同时,您必须找到一种解决方法,具体取决于您需要解析的输入类型。例如。 this bug report

更新:X仅可从Nougat +。

获得

文档有the OP's answer添加“支持(API级别)”列,表示仅从API级别24开始支持X。可能是OP的IllegalArgumentException到期了在24之前的设备上测试应用程序,因为之前的文档没有提及任何支持的API级别。

答案 1 :(得分:11)

我相信我在issue at GitHub中找到了答案:

  

你是对的,Android使用aws-cli代替生成时区   ZZZZZ(如Java中的+01:00)。目前,您是否可以尝试使用XXX方法自定义日期时间格式   让它在Android中运行?

     

以petstore样本为例:

ApiClient#setDatetimeFormat

显然,我必须使用:

// import io.swagger.client.Configuration;
// import io.swagger.client.ApiClient;
// import java.text.SimpleDateFormat;

// Customize for the default ApiClient
Configuration.getDefaultApiClient().setDatetimeFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ"));

// Customize for a new ApiClient
ApiClient apiClient = new ApiClient();
apiClient.setDatetimeFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ"));
// Use the new ApiClient
PetApi api = new PetApi(apiClient);
api.getPetById(new Long(1));

答案 2 :(得分:0)

您需要的模式是"yyyy-MM-dd'T'HH:mm:ss.SSSXXX",但它在异常中提到了小写x。看起来你某处有拼写错误。

答案 3 :(得分:-1)

我认为您正在寻找“yyyy-MM-dd'T'HH:mm:ss.SSSZ”

将日期格式更改为

DateFormat df = new SimpleDateFormat(“yyyy-MM-dd'T'HH:mm:ss.SSS”); 或

DateFormat df = new SimpleDateFormat(“yyyy-MM-dd'T'HH:mm:ssZ”);

这可能会对你有所帮助