使用 Joda Time 将简单的民用时间解析为完整的日期和时间

Parsing simple civilian time to full date and time using Joda Time

我有一个时间间隔字符串:

"04:00 PM - 04:30 PM"

我的目标是使用 Joda Time 将此字符串解析为如下所示的开始和结束时间变量:

String startTime = "2019-06-11T04:00:00"

String endTime = "2019-06-11T04:30:00"

毫秒将永远是00,我可以使用joda时间库轻松获取当前日期,但是我在从间隔字符串到两个的完整实现中遇到了很多困难最终字符串。

感谢您的帮助!

我目前的尝试是:

String[] selectedTime = interval.split(" - ");
DateTimeFormatter parser = ISODateTimeFormat.dateTime();
DateTime dtStart = parser.parseDateTime(selectedTime[0]);
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss");
String startTime = formatter.print(dtStart);

我明白为什么这不起作用,因为我没有传递所有必需的信息,例如年、月、日和毫秒。

仅供参考,Joda-Time project is now in maintenance mode, advising migration to the java.time classes. See Tutorial by Oracle

java.time

您输入的内容缺少时区指示符或 offset-from-UTC。所以解析为 LocalDateTime 个对象。

您输入的文本采用标准 ISO 8601 格式。这些标准格式在 java.time classes 中默认用于 generating/parsing 字符串。因此无需指定格式模式。

LocalDateTime ldt = LocalDateTime.parse( "2019-06-11T04:00:00" ) ;

您只需要 time-of-day,因此提取一个 LocalTime 对象。

LocalTime lt = ldt.toLocalTime() ;

通常最好让 DateTimeFormatter class 自动为您本地化。

Locale locale = Locale.CANADA_FRENCH ;  // Or Locale.US, Locale.ITALY, etc.
DateTimeFormatter f = DateTimeFormatter.ofLocalizedTime( FormatStyle.MEDIUM ).withLocale( locale ) ;
String output = lt.format( f ) + " — " + otherLt.format( f ) ;

否则,如果必须,请指定特定的格式模式。

DateTimeFormatter f = DateTimeFormatter.ofPattern( "HH:mm a" , Locale.US ) ;
String output = lt.format( f ) + " to " + otherLt.format( f ) ;

早些时候Android

大多数 java.time 功能是 back-ported 到 Java 6 & Java 7 在 ThreeTen-Backport project. Further adapted for earlier Android (<26) in ThreeTenABP. See .

对于 Android 26 及更高版本,java.time 的实现是 built-in.

Basil Bourque 是正确的,您应该更喜欢 java.time,现代 Java 日期和时间 API,而不是 Joda-Time。如果您已经经常使用 Joda-Time 并且不想现在升级到 java.time,这里是您问题的 Joda-Time 解决方案。 编辑: 我已重写代码以考虑您的以下评论:

…Could you possible provide some assistance regarding how to determine the endtime - time zone? There is such a case where the interval will be from "11:30 PM - 12:00 AM." Now, the current time is 11:30, so the DateTimeZone will return today's date. As I attempt to generate the string for the end time, it's date will be set for today's date, but the final string should have the next day's date because it is reference to 12:00 am.…

    String interval = "04:00 PM - 04:30 PM";
    String[] selectedTime = interval.split(" - ");
    DateTimeFormatter parser = DateTimeFormat.forPattern("hh:mm a");
    LocalDate today = new LocalDate(DateTimeZone.getDefault());
    LocalTime tStart = parser.parseLocalTime(selectedTime[0]);

    String startTime = today.toLocalDateTime(tStart).toString();
    System.out.println("Start time: " + startTime);

当运行今天的输出是:

Start time: 2019-06-12T16:00:00.000

由于 4 PM 在 24 小时制中是 16 点,我认为这就是您想要的结果。如果你想在没有毫秒的情况下进行格式化,只需格式化 LocalDateTime 你得到的方式与你在问题中格式化 dtStart 的方式相同。

结束时间有点复杂:

    LocalTime tEnd = parser.parseLocalTime(selectedTime[1]);
    String endTime;
    if (tEnd.isBefore(tStart)) {
        // Assume that end time is after midnight, that is, tomorrow
        endTime = today.plusDays(1).toLocalDateTime(tEnd).toString();
    } else {
        // The normal case: both start and end times are today
        endTime = today.toLocalDateTime(tEnd).toString();
    }
    System.out.println("End time: " + endTime);

End time: 2019-06-12T16:30:00.000

如果我们有

    String interval = "11:30 PM - 12:00 AM";

End time: 2019-06-13T00:00:00.000

Joda-Time 处于维护模式

引自 Joda-Time 主页:

Note that Joda-Time is considered to be a largely “finished” project. No major enhancements are planned. If using Java SE 8, please migrate to java.time (JSR-310).

(https://www.joda.org/joda-time/)

即使您正在为较旧的 Android(低于 API 级别 26)编写代码,至少对于新代码,我更喜欢对 ThreeTenABP 的依赖,而不是对 Joda-Time 的依赖。