获取正确的Joda LocalDateTime值,然后格式化它们

时间:2013-02-13 17:14:37

标签: java string-formatting jodatime

我试图在每个星期天午夜运行一份报告,其中包括上周六午夜的数据,以及报告开始之前的11:59:59。因此,如果它将在即将到来的星期日(2/17)开始,它会:

  • 于2013年2月17日午夜(或周一早上执行,但您想要考虑)
  • 包括从2/10/2013 12:00:00 AM(上周六午夜)开始的数据
  • 包括截至2013年2月16日晚上11:59:59的数据(本周六晚,报告发布前仅1秒)

我正在尝试获取startDateTimeendDateTime来封装时间范围,并希望使用JODA LocalDateTime来保存每个值。然后我需要将它们格式化为YYYYMMDD_HHmmss格式的字符串。

这是我最好的尝试:

LocalDateTime rightNow = new LocalDateTime();
LocalDateTime startDateTime = rightNow.minusDays(7);
LocalDateTime endDateTime = rightNow.minusDays(1);

String startDateTimeFormatted = startDateTime.toString();
String endDateTimeFormatted = endDateTime.toString();

System.out.println(startDateTimeFormatted);
System.out.println(endDateTimeFormatted);

当我跑步时,我得到:

2013-02-06T12:10:27.411
2013-02-12T12:10:27.411

注意:因为我今天(2013年2月13日)运行此代码,所以开始/结束日期不同,那么它们将在2月17日星期日(或任何其他星期日),但它的时间表示和字符串格式我真的很感兴趣。

所以我问:

  1. 如何让startDateTime代表(对于这个例子 - 但我需要动态的答案!)2/10/2013 12:00:00 AM
  2. 如何让endDateTime代表(对于这个例子 - 但我需要动态的答案!)2/16/2013 11:59:59 PM
  3. 如何将startDateTimeendDateTime格式化为分别显示为20130210_120000和20130216_115959?
  4. 提前致谢。

2 个答案:

答案 0 :(得分:5)

好的,如前所述,我强烈建议使用UTC作为时区,并使用独占终点。所以,你可以使用:

private static final DateTimeFormatter FORMATTER =
    DateTimeFormat.forPattern("yyyyMMdd'_'HHmmss")
                  .withLocale(Locale.US);
...

// I prefer to be explicit about using "the current time". I prefer to use
// an injectable dependency such as a Clock type, too...
DateTime now = new DateTime(System.currentTimeMillis(), DateTimeZone.UTC);

// Note: this *doesn't* ensure that it's the right day of the week.
// You'd need to think about that separately - it may be as simple as
// scheduling it appropriately... but bear your local time zone in mind!
DateTime end = now.withTimeAtStartOfDay();
DateTime start = end.minusDays(7);

String startText = FORMAT.print(start);
String endText = FORMAT.print(end);

进一步请注意,这将使用24小时制,因此它会提供20130210_00000020130217_000000,而不是使用120000作为时间。这更加一致和明确。鉴于它总是在午夜,你可能只想使用yyyyMMdd并完全删除时间部分。

答案 1 :(得分:1)

的System.out.println(DateTime.now()的toString( “YYYY-MM-DD”));

toString方法接受格式化模板,请参阅:http://joda-time.sourceforge.net/apidocs/org/joda/time/format/DateTimeFormat.html