Java 获取正确的Joda LocalDateTime值,然后格式化它们
我试图在每个周日午夜运行一份报告,其中包括上周六午夜到报告开始前11:59:59的数据。因此,如果在即将到来的周日(2月17日)开始,它将: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来保存每个值。然后我
- 2013年2月17日午夜执行(或周一上午,不管你怎么想)
- 包括2013年10月2日12:00:00(上周六午夜)开始的数据
- 包括截至2013年2月16日11:59:59的数据(本周六晚,报告发布前仅1秒)
startDateTime
和endDateTime
来封装时间范围,并希望使用一个JODALocalDateTime
来保存每个值。然后我需要将它们格式化为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_115959toString方法接受一个格式模板,请参见:好的,如前所述,我强烈建议使用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是格式中的小数秒。