我尝试将String转换为DateTime
对象,然后只将时间部分保存回String
。
我收到了上述异常。 我怎样才能将时间部分例如H:mm从原始部分中抽出来?
因此原始日期时间为: 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)
[EDIT1]
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)
答案 0 :(得分:1)
您的数据模式似乎有误。如果您的原始日期字符串为2014-05-02T21:00:00+01:00
,则应为yyyy-MM-dd'T'HH:mm:ss.Z
,而无需修剪或替换“T”字符
答案 1 :(得分:1)
您的输入字符串符合ISO 8601标准。在解析/生成日期时间值的文本表示时,Joda-Time和java.time框架都使用此标准作为其默认值。所以无需指定编码解析模式或格式化程序。
以下代码创建一个指定了+01:00
的UTC偏移量的日期时间。
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的偏移量。使用continent/region
格式Africa/Tunis
,例如Europe/Paris
或EST
。切勿使用IST
或DateTimeZone zone = DateTimezone.forID( "Europe/Paris" );
DateTime dateTime_Europe_Paris = dateTime.withZone( zone );
之类的3-4字母代码,这些代码既不是标准化也不是唯一的。
DateTimeFormatter formatter = ISODateTimeFormat.hourMinute();
String output = formatter.print( dateTime_Europe_Paris );
从该DateTime对象中,我们生成其时间值的String表示。我们需要一个proper time zone name来定义这个String格式。幸运的是,Joda-Time已经为我们预先定义了一个,只需要小时和分钟值,可以通过调用静态方法DateTimeFormatter
来访问。
public class HomeController : Controller
{
public string GetName()
{
return "Mike";
}
}
使用示例代码为Joda-Time搜索StackOverflow以获取许多更多问题和答案。