当前位置: 首页 > 知识库问答 >
问题:

如何获取一个时段的开始和结束时间?

薛飞星
2023-03-14

我有一个enum时间框架,其值如下:昨天上周下个月等。

我试图编写一个方法,它接受TimeFrame并返回该时间段的开始和结束日期。

我研究了新的Java8Period类,该类可能需要一个开始时间和结束时间,但似乎没有任何干净的方法可以在之后检索这些值。

如果不使用列表(似乎是错误的数据结构)或一些难看的日期时间算法,我如何能一次干净地返回开始日期和结束日期?

共有2个答案

伍耀
2023-03-14

小心传递“昨天”、“明天”等的枚举值。这引发了几个问题,时区和午夜。

日期和星期几只有在时区的上下文中才有意义。在任何给定的时刻,日期都会在全球范围内变化。例如,巴黎午夜后几分钟仍然是蒙特利尔的“昨天”。所以当你打算“昨天”之类的时候,也一定要指定期望/预期的时区。

每个非原子命令和代码行与前一个命令和代码行分开执行。每次执行都需要一段时间,无论多么短暂。在上述任何时刻,特定时区的午夜可能会进入新的一天。在午夜的钟声中,你的相对时间标志,如“昨天”,突然有了一个全新的含义。鉴于早期代码开始时的条件(日期)不同,该含义可能与早期代码的意图不同。

所以对我来说,传递Instant对象,或者可能是OffsetDateTimeZonedDateTime对象更有意义。这些日期时间值被冻结,代表时间线上的特定时刻。您早期的原始代码可以验证该值的含义,检查日期是否确实是星期五或类似的日期。在这样的验证之后,该值可以传递给其他代码。现在你不需要担心午夜偶尔会出现奇怪的错误。

你真的不需要构建一个类或枚举来表达你对相对时间的意图,比如“昨天”。爪哇。Java 8及更高版本中内置的时间类具有简单的读取方法,可以对天、周、月进行加减。这些基本上是一行程序,所以只需直接调用加…减…方法即可。

ZonedDateTime now = ZonedDateTime.now();
ZonedDateTime yesterday = now.minusDays( 1 );
ZonedDateTime weekLater = now.plusWeeks( 1 );

这段代码隐式地应用了JVM当前的默认时区。最好具体说明。

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now( zoneId );

你可能只想要没有时间和时区的日期。使用LocalDate

LocalDate weekPrior = now.toLocalDate().minusWeeks( 1 );

你可能想要一天中的第一刻。并非总是00:00:00.0的时间。

ZonedDateTime yesterdayStart = now.minusDays( 1 ).toLocalDate().atStartOfDay( zoneId );

如果想要表示由一对日期时间值定义的时间跨度,请查看扩展java的Three Ten Extra项目中的Interval类。时间框架。此类跟踪一对即时对象,它们是UTC时间轴上的时刻。通过调用toInstant,可以从ZoneDateTime中提取即时

Interval intervalYesterday = Interval.of( yesterdayStart.toInstant() , yesterdayStart.plusDays( 1 ).toInstant() );

要从即时返回到分区日期时间,请应用分区ID

ZonedDateTime zdt = ZonedDateTime( instant , zoneId );

对于仅限日期的间隔,您需要构建自己的类来存储一对LocalDate对象。我会把它叫做DateRange

小贴士:搜索“半开放”以了解跟踪时间跨度的做法,其中开始是包容性的,而结束是排他性的。

金阳曜
2023-03-14

不,期间不记录开始/结束-它只是表示它们之间的时间量,在历法意义上(而不是由期间表示的“精确时间量”)。

听起来基本上你应该创建一个有开始日期和结束日期的类。您仍然可以使用Period来实现这一点,但是您需要getStartDate()getEndDate()返回LocalDate值。你不需要自己做任何繁重的日期/时间算术——只需计算出开始日期并加上适当的时间段,或结束日期并减去适当的时间段,这取决于时间范围。

 类似资料:
  • 我想从JavaGUI到数据库获取startTime和endTime的值。 电脑座位班 Cobadatabase类 这里的问题是,当单击登录按钮时,开始时间显示在我的数据库中的开始时间和结束时间列上。当单击注销按钮时,将在数据库中创建另一个行,该行在starTime和endTime列上都包含endTime。我想知道为什么会这样...

  • 我的日期格式为:YYYY-MM-DD 所需的输出格式是:"yyyy-MM-dd'T'HH: mm: ss.SSS'Z'" 我想在美国/芝加哥时区获得ISO格式的日期,作为一天的开始时间(从上午12:00开始)和一天的结束时间(结束于晚上11:59)。 对于eg.日期: 2020-06-08(6月8日)转换后的最终输出如下: 当天开始时间为日期: 2020-06-08T05:00:00.000Z 截

  • 问题内容: 我想知道如何计算本周的开始和结束日期?我发现这不是在标准android库或date4j之类的库中实现的。 是否有一些简单明了的实现方法?还是我必须再次骑自行车? 谢谢。 问题答案: 也许MonthDisplayHelper可能对您有所帮助。 祝好运!

  • 问题内容: 我在表中有此数据 每当FIELD_D中的值更改时,它就会组成一个组,而我需要该组中的最小和最大日期。查询应该返回 到目前为止,我看到的示例在Field_D中的数据是唯一的。这里的数据可以重复显示,首先是“ N”,然后变为“ P”,然后又回到“ N”。 任何帮助将不胜感激 谢谢 问题答案: 如果SQL实现支持分析功能,则可以使用LAG,LEAD和COUNT()OVER这样的解析函数,以发

  • 问题内容: 我有这样的时间戳字符串: 我想对它们进行排序,以便可以从上述时间戳获取起始范围和终止范围。我正在做如下: 这将为我提供上述时间戳列表的开始和结束范围。这是正确的方法还是有更好的方法? 更新资料 因此,我应该执行以下操作: 问题答案: 将那些ISO 8601 字符串解析为对象。 将这些日期时间对象添加到并排序。您可能想要诸如或。 java.time类实现该方法,以作为实现合同。因此,这些