Android将字符串解析为日期-未知模式字符'X'

问题描述 投票:44回答:11

我有Service从Web上获取日期字符串,然后将其切成Date对象。但是以某种方式应用程序崩溃。这是我正在解析的字符串:2015-02-05T05:20:02+00:00

onStartCommand()

String datetime = "2015-02-05T05:20:02+00:00";
Date new_date = stringToDate(datetime);

stringToDate()

private Date stringToDate(String s){
    DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
    try{
        return df.parse(s);
    }catch(ParseException e){
        e.printStackTrace();
    }
    return null;
}

LogCat:

02-06 20:37:02.008: E/AndroidRuntime(28565): FATAL EXCEPTION: main
02-06 20:37:02.008: E/AndroidRuntime(28565): Process: com.dotmav.runescapenotifier, PID: 28565
02-06 20:37:02.008: E/AndroidRuntime(28565): java.lang.RuntimeException: Unable to start service com.dotmav.runescapenotifier.GEService@384655b5 with Intent { cmp=com.dotmav.runescapenotifier/.GEService }: java.lang.IllegalArgumentException: Unknown pattern character 'X'
02-06 20:37:02.008: E/AndroidRuntime(28565):    at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2881)
02-06 20:37:02.008: E/AndroidRuntime(28565):    at android.app.ActivityThread.access$2100(ActivityThread.java:144)
02-06 20:37:02.008: E/AndroidRuntime(28565):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1376)
02-06 20:37:02.008: E/AndroidRuntime(28565):    at android.os.Handler.dispatchMessage(Handler.java:102)
02-06 20:37:02.008: E/AndroidRuntime(28565):    at android.os.Looper.loop(Looper.java:135)
02-06 20:37:02.008: E/AndroidRuntime(28565):    at android.app.ActivityThread.main(ActivityThread.java:5221)
02-06 20:37:02.008: E/AndroidRuntime(28565):    at java.lang.reflect.Method.invoke(Native Method)
02-06 20:37:02.008: E/AndroidRuntime(28565):    at java.lang.reflect.Method.invoke(Method.java:372)
02-06 20:37:02.008: E/AndroidRuntime(28565):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
02-06 20:37:02.008: E/AndroidRuntime(28565):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
02-06 20:37:02.008: E/AndroidRuntime(28565): Caused by: java.lang.IllegalArgumentException: Unknown pattern character 'X'
02-06 20:37:02.008: E/AndroidRuntime(28565):    at java.text.SimpleDateFormat.validatePatternCharacter(SimpleDateFormat.java:314)
02-06 20:37:02.008: E/AndroidRuntime(28565):    at java.text.SimpleDateFormat.validatePattern(SimpleDateFormat.java:303)
02-06 20:37:02.008: E/AndroidRuntime(28565):    at java.text.SimpleDateFormat.<init>(SimpleDateFormat.java:356)
02-06 20:37:02.008: E/AndroidRuntime(28565):    at java.text.SimpleDateFormat.<init>(SimpleDateFormat.java:249)
02-06 20:37:02.008: E/AndroidRuntime(28565):    at com.dotmav.runescapenotifier.GEService.stringToDate(GEService.java:68)
02-06 20:37:02.008: E/AndroidRuntime(28565):    at com.dotmav.runescapenotifier.GEService.onStartCommand(GEService.java:44)
02-06 20:37:02.008: E/AndroidRuntime(28565):    at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2864)
02-06 20:37:02.008: E/AndroidRuntime(28565):    ... 9 more

EDIT: onDestroy()设置警报以定期更新...

AlarmManager alarm = (AlarmManager)getSystemService(ALARM_SERVICE);
alarm.set(
    AlarmManager.RTC_WAKEUP,
    System.currentTimeMillis() + (1000 * 60),
    PendingIntent.getService(this, 0, new Intent(this, GEService.class), 0)
);
java android date simpledateformat
11个回答
29
投票

从中删除“ XXX”>

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");

并且一切正常。

浏览可在SimpleDateFormat构造函数中使用的符号列表。尽管documentation显示为“ XXX”格式,但这在Android上不起作用,并且会抛出IllegalArgumentException

可能您正在寻找"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"); // if timezone is required

1
投票
使用Android生成格式正确的ThreeTenABP输出:

ThreeTen-Extra


0
投票
以下样式可用于在模式不知道时将字符串转换为日期。

String


43
投票

Android版本的SimpleDateFormat不支持X模式,因此XXX不起作用,但是您可以使用ZZZZZ进行相同的操作并以+02:00格式输出时区(或[ C0](取决于当地时区)。


17
投票

没有人提到牛轧糖之前的设备]上发生此错误,所以我想分享我的答案,也许这对那些因为此而到达此线程的人有所帮助。


11
投票

您使用的日期格式错误。


8
投票

由于Z和XXX不同,我已经实现了以下解决方法:


6
投票

Android // This is a workaround from Z to XXX timezone format new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ") { @Override public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition pos) { StringBuffer rfcFormat = super.format(date, toAppendTo, pos); return rfcFormat.insert(rfcFormat.length() - 2, ":"); } @Override public Date parse(String text, ParsePosition pos) { if (text.length() > 3) { text = text.substring(0, text.length() - 3) + text.substring(text.length() - 2); } return super.parse(text, pos); } } 与Java 7 SDK不同,并且不支持'X'来解析ISO8601。您可以使用'Z'或'ZZZZZ'样式来格式化并将时区设置为UTC。这是一个util类:


3
投票

简单解决方案:


2
投票
错误是说simpleDateFormat无法识别字符X。如果要查找的毫秒数则用字符S表示。

yyyy-MM-dd'T'HH:mm:ss.SSSXXX


1
投票
tl; dr

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");

© www.soinside.com 2019 - 2024. All rights reserved.