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

Java 获取正确的Joda LocalDateTime值,然后格式化它们,java,string-formatting,jodatime,Java,String Formatting,Jodatime,我试图在每个周日午夜运行一份报告,其中包括上周六午夜到报告开始前11:59:59的数据。因此,如果在即将到来的周日(2月17日)开始,它将: 2013年2月17日午夜执行(或周一上午,不管你怎么想) 包括2013年10月2日12:00:00(上周六午夜)开始的数据 包括截至2013年2月16日11:59:59的数据(本周六晚,报告发布前仅1秒) 我试图获取一个startDateTime和endDateTime来封装时间范围,并希望使用一个JODALocalDateTime来保存每个值。然后我

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

  • 2013年2月17日午夜执行(或周一上午,不管你怎么想)
  • 包括2013年10月2日12:00:00(上周六午夜)开始的数据
  • 包括截至2013年2月16日11:59:59的数据(本周六晚,报告发布前仅1秒)
我试图获取一个
startDateTime
endDateTime
来封装时间范围,并希望使用一个JODA
LocalDateTime
来保存每个值。然后我需要将它们格式化为YYYYMMDD\uHHMMSS格式的字符串

以下是我最好的尝试:

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日)运行这段代码,因此开始/结束日期与2017年2月17日(或任何其他周日)的开始/结束日期不同,但我在这里真正感兴趣的是时间表示和字符串格式

所以我问:

  • 如何获得要表示的
    startDateTime
    (对于本例,但我需要动态的答案!)2013年10月2日12:00:00上午
  • 如何获得要表示的
    endDateTime
    (对于本例-但我需要动态的答案!)2013年2月16日11:59:59下午
  • 如何将
    startDateTime
    endDateTime
    的格式分别设置为20130210_120000和20130216_115959
  • 提前感谢。

    System.out.println(DateTime.now().toString(“yyyy-MM-dd”)


    toString方法接受一个格式模板,请参见:

    好的,如前所述,我强烈建议使用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_000000
    20130217_000000
    而不是使用
    120000
    作为时间。这是更加一致和明确的。考虑到总是午夜,您可能只想使用
    yyyyymmdd
    并完全删除时间部分。

    是否可以将结束时间设为独占时间,此时正好是开始时间后一周(等于下一个开始时间)?这通常比较干净,否则就不清楚11:59:59.999的位置。另外,您在这里使用
    LocalDateTime
    而不是
    DateTime
    有什么原因吗?后者会觉得更合适,因为报告可能是基于特定时间发生的事情。谢谢@JonSkeet(+1)-是的,我非常高兴结束时间是独占的,就像你说的,这样数据就不会在11:59:59.999丢失。不,不喜欢
    LocalDateTime
    DateTime
    ;我总是使用
    LocalDateTime
    ,这就是为什么我把它放在原始问题中,但没有偏好。再次感谢!在我试图写一个答案之前,还有最后一个问题(尽管由于其他原因,这个问题可能不会很快出现)——你真的希望这一切都发生在当地时区吗?使用UTC将提供更高的一致性。UTC@JonSkeet适用-不需要本地时区。再次感谢!在我看来,最好创建一个
    DateTimeFormatter
    的实例并反复使用。他提到他想要一种动态的格式化方法,但如果格式不会改变,那么一个DateTimeFormat对象就是最好的选择。谢谢@AlexChacha(+1)-但是获取两个日期/时间如何,其中一个在12:00:00,另一个在11:59:59.999?“hh:mm:ss”和“hh:mm:ss.SSS”可能是您需要的。SSS是格式中的小数秒。