使用Joda-Time获取会议记录

时间:2013-12-22 15:12:19

标签: java android date time jodatime

以下是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”

任何想法都错了吗?

3 个答案:

答案 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类。你工作太辛苦了。

  • DateTime类直接在其构造函数中使用ISO 8601字符串。
  • 在DateTime上调用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

java.time

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.
相关问题