以下是zulu日期字符串:
2013-12-18T23:41:54.959Z
我想将其转换为GMT并使用Joda-Time检索分钟。我构建了以下方法:
public static int minutesFromDateString(final String s){
DateTimeFormatter formatter = DateTimeFormat.forPattern("HH:mm").withZone(DateTimeZone.forID("Europe/Berlin"));
DateTime dt = formatter.parseDateTime(s);
Calendar calendar = Calendar.getInstance();
calendar.setTime(dt.toDate());
return calendar.get(Calendar.MINUTE);
}
然而,这会返回错误:
12-22 16:04:11.940:E / AndroidRuntime(6433): java.lang.IllegalArgumentException:格式无效: “2013-12-18T23:41:54.959Z”格格不入“13-12-18T23:41:54.959Z”
任何想法都错了吗?
答案 0 :(得分:5)
您没有使用有效的模式。你的模式说它正在寻找HH:mm,你真正的字符串要复杂得多。查看DateTimeFormat文档。看起来你想要这样的东西:“yyyy-mm-dd'T'HH:mm:ss.SSS'Z'”
答案 1 :(得分:5)
只需设置正确的模式:"yyyy-MM-dd'T'HH:mm:ss.SSSZ"
在你的情况下:
public static int minutesFromDateString(final String s){
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ").withZone(DateTimeZone.forID("Europe/Berlin"));
DateTime dt = formatter.parseDateTime(s);
Calendar calendar = Calendar.getInstance();
calendar.setTime(dt.toDate());
return calendar.get(Calendar.MINUTE);
}
输出:
41
请参阅文档HERE
答案 2 :(得分:4)
answer by PearsonArtPhoto是正确的。要添加更多...
使用Joda-Time,不需要格式模式,也不需要Calendar类。你工作太辛苦了。
getMinuteOfHour
方法以仅提取该部分。如果您想要UTC / GMT而不是specific time zone,请传递内置常量DateTimeZone.UTC
。请注意,时区可能会影响您的分钟。并非所有时区都按整小时调整。例如,印度在UTC / GMT(+05:30)之前的偏差为5个半小时。
String input = "2013-12-18T23:41:54.959Z";
DateTimeZone timeZone = DateTimeZone.forID( "Europe/Berlin" ); // Or, DateTimeZone.UTC;
DateTime dateTime = new DateTime( input, timeZone );
int minuteOfHour = dateTime.getMinuteOfHour();
转储到控制台...
System.out.println( "dateTime: " + dateTime );
System.out.println( "minuteOfHour: " + minuteOfHour );
跑步时......
dateTime: 2013-12-19T00:41:54.959+01:00
minuteOfHour: 41
Joda-Time已被Java 8及更高版本中内置的java.time框架正式取代。虽然Joda-Time不断更新,但未来的工作将进入java.time类及其扩展,ThreeTen-Extra项目。
大部分java.time已经被反向移植到Java 6& ThreeTen-Backport项目中的7。该工作适用于ThreeTenABP项目中的Android。
上面的讨论适用于java.time解决方案。 Instant
是UTC时间轴上的一个时刻。应用时区ZoneId
即可获得ZonedDateTime
。
String input = "2013-12-18T23:41:54.959Z";
Instant instant = Instant.parse( input );
ZoneId zoneId = ZoneId.of( "Europe/Berlin" ); // Or, ZoneOffset.UTC;
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant, zoneId );
int minuteOfHour = zdt.getMinute(); // Gets the minute-of-hour field.