【问题标题】:Joda Time: how to parse time and set default date as today's dateJoda Time:如何解析时间并将默认日期设置为今天的日期
【发布时间】:2014-08-20 10:46:21
【问题描述】:

我必须以格式解析日期:

HH:mm 
dd MMM 
dd MMM yyyy

我已经设法处理了最后两个:

val dateParsers = Array(
    DateTimeFormat.forPattern("dd MMM").getParser,
    DateTimeFormat.forPattern("dd MMM yyyy").getParser,
    ISODateTimeFormat.timeParser().getParser
)

val formatter = new DateTimeFormatterBuilder().append(null, dateParsers).toFormatter.withZoneUTC
DateTime.parse(updatedString, formatter.withDefaultYear(currentYear).withLocale(ruLocale))

dd MMMdd MMM yyyy 一切正常,但是当我尝试解析时间时,例如 05:40,我得到的是 01-01-1970 日期而不是今天的日期。在解析器中将默认日期设置为今天的日期的最简单方法是什么?

【问题讨论】:

  • 您可以尝试将时间为 00:00:00.000 的当前日期添加到解析时间。似乎有一个类DateMidnight,因此您可能希望将解析的时间添加到该类的实例中。
  • 这是 Java 吗?看起来像另一种 JVM 语言。
  • 另一个选项可能是DateTime.withTimeAtStartOfDay().plus( yourParsedDateTime.getMillis())。请注意,您可能需要处理时区差异或指定时区,但我会留给您。
  • 其实是scala,我修复了标签
  • @Thomas 不推荐使用“午夜”相关的类和方法。 (a) 午夜很难定义。 (b) 一天中的第一刻不一定是00:00:00.000,因为夏令时废话和可能的其他异常情况。而是使用新的withTimeAtStartOfDay 方法。 DateTime today = DateTime.now( DateTimeZone.forID( "America/Montreal" ) ).withTimeAtStartOfDay();

标签: scala date time jodatime


【解决方案1】:

Joda-Time-Formatter 只支持withDefaultYear(),不支持withDefaultDate()。相反,您可以这样做:

DateTimeFormatter timeParser = DateTimeFormat.forPattern("HH:mm");
LocalTime time = timeParser.parseLocalTime("05:40");
DateTimeZone tz = DateTimeZone.getDefault(); // Or DateTimeZone.UTC or DateTimeZone.forID( "Europe/Paris" )
LocalDate today = LocalDate.now(tz);
DateTime moment = today.toLocalDateTime(time).toDateTime(tz);
System.out.println(moment);
// output in my local timezone: 2014-08-20T05:40:00.000+02:00

注意:我已经用 Java 编写了解决方案,因为我不是 scala-guy。

【讨论】:

    【解决方案2】:

    DateTime 完全不同,没有子类化 DateTimeFormatter 并实现你的特殊“今天的时间”-算法你不会走得太远。如果它与某个正则表达式匹配,则可以子类化或将您当前的日期注入到字符串中

    【讨论】:

    • 我确实使用了注入,但我希望有更合适的方法。我认为子类化是多余的。
    【解决方案3】:

    我会使用 withDate()

    private static final DateTimeFormatter FORMATTER = DateTimeFormat.forPattern("HH:mm");
    @Test
    public void test() {
        DateTime dateTime = FORMATTER.parseDateTime("05:40");
        DateTime now = new DateTime();
        dateTime = dateTime.withDate(now.getYear(), now.getMonthOfYear(), now.getDayOfMonth());
        System.out.println(dateTime.toDate());
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-12
      • 2012-01-14
      • 2014-04-08
      相关资源
      最近更新 更多