Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.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
Android Joda DateTime IllegalArgument异常将字符串转换为DateTime_Android_Jodatime - Fatal编程技术网

Android Joda DateTime IllegalArgument异常将字符串转换为DateTime

Android Joda DateTime IllegalArgument异常将字符串转换为DateTime,android,jodatime,Android,Jodatime,我试图将字符串转换为DateTime对象,然后只将时间部分保存回字符串中 我得到了上面的例外。 我怎样才能把时间部分从原稿中删去呢 因此原始日期时间为:2014-05-02T21:00:00+01:00 而我只想要21:00部分 Log.e(TAG, "recordItem[0] = " + recordItem[0]); recordItem[0] = recordItem[0].replace('[', ' '); recordItem[0] = recor

我试图将字符串转换为
DateTime
对象,然后只将时间部分保存回
字符串中

我得到了上面的例外。 我怎样才能把时间部分从原稿中删去呢

因此原始日期时间为:
2014-05-02T21:00:00+01:00

我只想要
21:00
部分

Log.e(TAG, "recordItem[0] = " + recordItem[0]);

        recordItem[0] = recordItem[0].replace('[', ' ');
        recordItem[0] = recordItem[0].trim();

        recordItem[0] = recordItem[0].replace('T', ' ');



        DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyy-MM-dd H:mm:ss.SSS");
        DateTime dt = dtf.parseDateTime(recordItem[0]);

        DateTimeFormatter fmt = DateTimeFormat.forPattern("H:mm");
        String formattedStart = fmt.print(dt);

        Log.e(TAG, "formattedStart = " + formattedStart);

        callStartTime = formattedStart;

控制台日志:

05-02 16:10:25.780: E/CarerDetailsFragment(6430): recordItem[0] = [2014-05-02T21:00:00+01:00
05-02 16:10:25.780: D/AndroidRuntime(6430): Shutting down VM
05-02 16:10:25.780: W/dalvikvm(6430): threadid=1: thread exiting with uncaught exception (group=0x409ed1f8)
05-02 16:10:25.780: E/AndroidRuntime(6430): FATAL EXCEPTION: main
05-02 16:10:25.780: E/AndroidRuntime(6430): java.lang.IllegalArgumentException: Invalid format: "2014-05-02 21:00:00+01:00" is malformed at "+01:00"
05-02 16:10:25.780: E/AndroidRuntime(6430):     at org.joda.time.format.DateTimeFormatter.parseDateTime(DateTimeFormatter.java:866)
05-02 16:10:25.780: E/AndroidRuntime(6430):     at com.carefreegroup.rr3.carefreeoncall.CarerDetailsFragment.onListItemClick(CarerDetailsFragment.java:395)
05-02 16:10:25.780: E/AndroidRuntime(6430):     at android.app.ListFragment$2.onItemClick(ListFragment.java:160)
05-02 16:10:25.780: E/AndroidRuntime(6430):     at android.widget.AdapterView.performItemClick(AdapterView.java:292)
05-02 16:10:25.780: E/AndroidRuntime(6430):     at android.widget.AbsListView.performItemClick(AbsListView.java:1058)
05-02 16:10:25.780: E/AndroidRuntime(6430):     at android.widget.AbsListView$PerformClick.run(AbsListView.java:2514)
05-02 16:10:25.780: E/AndroidRuntime(6430):     at android.widget.AbsListView$1.run(AbsListView.java:3168)
05-02 16:10:25.780: E/AndroidRuntime(6430):     at android.os.Handler.handleCallback(Handler.java:605)
05-02 16:10:25.780: E/AndroidRuntime(6430):     at android.os.Handler.dispatchMessage(Handler.java:92)
05-02 16:10:25.780: E/AndroidRuntime(6430):     at android.os.Looper.loop(Looper.java:137)
05-02 16:10:25.780: E/AndroidRuntime(6430):     at android.app.ActivityThread.main(ActivityThread.java:4424)
05-02 16:10:25.780: E/AndroidRuntime(6430):     at java.lang.reflect.Method.invokeNative(Native Method)
05-02 16:10:25.780: E/AndroidRuntime(6430):     at java.lang.reflect.Method.invoke(Method.java:511)
05-02 16:10:25.780: E/AndroidRuntime(6430):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
05-02 16:10:25.780: E/AndroidRuntime(6430):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
05-02 16:10:25.780: E/AndroidRuntime(6430):     at dalvik.system.NativeStart.main(Native Method)
[第1版]

05-02 16:32:10.499: E/CarerDetailsFragment(6568): recordItem[0] = 2014-05-02T21:00:00+01:00
05-02 16:32:10.499: D/AndroidRuntime(6568): Shutting down VM
05-02 16:32:10.499: W/dalvikvm(6568): threadid=1: thread exiting with uncaught exception (group=0x409ed1f8)
05-02 16:32:10.509: E/AndroidRuntime(6568): FATAL EXCEPTION: main
05-02 16:32:10.509: E/AndroidRuntime(6568): java.lang.IllegalArgumentException: Invalid format: "2014-05-02T21:00:00+01:00" is malformed at "+01:00"
05-02 16:32:10.509: E/AndroidRuntime(6568):     at org.joda.time.format.DateTimeFormatter.parseDateTime(DateTimeFormatter.java:866)

您的数据模式似乎是错误的。如果原始日期字符串为
2014-05-02T21:00:00+01:00
则应为
yyyy-MM-dd'HH:MM:ss.Z
,无需修剪或替换“T”字符 您的输入字符串符合ISO 8601标准。Joda Time和java.Time框架在解析/生成日期时间值的文本表示时都使用此标准作为默认值。因此无需指定编码解析模式或格式化程序

乔达时间 以下代码创建了一个日期-时间,该日期-时间与UTC的偏移量为
+01:00

DateTime dateTime = DateTime.parse( "2014-05-02T21:00:00+01:00" );
使用构造函数具有不同的含义。下面的代码使用嵌入的偏移量解析该值,然后将结果调整到JVM的当前默认时区

DateTime dateTime = new DateTime( "2014-05-02T21:00:00+01:00" ) );
要考虑夏令时(DST)和其他异常情况,请调整到所需/预期时区,而不仅仅是UTC的偏移量。使用a,格式为
大陆/地区
,如
非洲/突尼斯
欧洲/巴黎
。切勿使用既不标准也不唯一的3-4字母代码,如
EST
IST

DateTimeZone zone = DateTimezone.forID( "Europe/Paris" );
DateTime dateTime_Europe_Paris = dateTime.withZone( zone );
从该DateTime对象中,我们生成其时间值的字符串表示形式。我们需要一个字符串来定义这个字符串格式。幸运的是,Joda Time已经为我们预定义了一个,只有小时和分钟值,通过调用静态方法访问


使用Joda Time的示例代码搜索StackOverflow以获取更多问题和答案。

我已将T放回,但在上面的Edit1中获得以下内容。它似乎不喜欢+0100,我想问题是“:”在时区,我的模式有点输入错误。试试这个yyyy-MM-dd'T'HH:MM:ssZ,然后应用转换来获得类似于2014-05-02T21:00:00+0100的东西。对于时区中的冒号,使用ZZ而不是Z
DateTimeFormatter formatter = ISODateTimeFormat.hourMinute();
String output = formatter.print( dateTime_Europe_Paris );