gpt4 book ai didi

java - 在java中为 'working day'创建公司特定时区

转载 作者:行者123 更新时间:2023-12-02 02:10:40 25 4
gpt4 key购买 nike

我在一家公司工作,一天的部分工作是在第二天凌晨完成的(即发货订单)。现在,对于多个流程(主要是报告),我们希望让“工作日”在第二天早上 04:00 结束,以便我们每天获得更一致的报告值。

我们希望始终在第二天早上 04:00,并且由于我们受到我们所在地区(欧洲 - 荷兰)夏令时的影响,我们实际上希望正常时区“欧洲/阿姆斯特丹”有 4 小时的偏移变体(在我们的例子中)。

为了使我们公司的所有应用程序都可以轻松使用它,我想创建一个小型库,其中仅包含代码,以便为我的同事提供获取执行此操作的 TimeZone 的修改实例。这样,所有正常的时间/日期操作方法都可以与这个特殊时区结合使用。

我深入研究了与 TimeZone/ZoneInfo 实例相关的标准 Java 8 代码/Javadoc,目前我不明白返回的 TimeZone/ZoneInfo 实例中要更改的正确字段是什么。

此时,我最好的猜测是将 RawOffset 设置为 4 小时,但我不确定。

实现目标的正确方法是什么?

<小时/>

更新:

我查看了建议的LocalTime,正如我所料:它需要一个时区定义,作为将现有时间戳(通常是纪元毫秒)转换为“本地”时使用的时区定义。 “本地”时区。

看看所有这些类,我似乎会比 LocalTime 更频繁地使用 LocalDate

实际上我期望的代码是这样的:

long epoch =  1525033875230L; // Obtained from some dataset
LocalDate localDate = LocalDateTime
.ofInstant(Instant.ofEpochMilli(epoch),
ZoneId.of("Europe/Amsterdam"))
.toLocalDate();

我希望我需要将该区域更改为“正确的区域”。

最佳答案

如果我理解正确,那么您真正需要的是一种将纪元以来的毫秒值转换为日期的方法,其中日期不会更改 00:00 但直到 04:00。

static ZoneId zone = ZoneId.of("Europe/Amsterdam");
static LocalTime lastShiftEnds = LocalTime.of(4, 0);

public static LocalDate epochMilliToDate(long epoch) {
ZonedDateTime dateTime = Instant.ofEpochMilli(epoch)
.atZone(zone);
if (dateTime.toLocalTime().isAfter(lastShiftEnds)) { // normal date-time
return dateTime.toLocalDate();
} else { // belonging to previous day’s night shift
return dateTime.toLocalDate().minusDays(1);
}
}

例如使用这样的:

    long epoch = 1_525_050_875_230L;
System.out.println(Instant.ofEpochMilli(epoch));
LocalDate date = epochMilliToDate(epoch);
System.out.println(date);

输出是:

2018-04-30T01:14:35.230Z
2018-04-29

通过打印Instant,您可以看到时间是在午夜之后(在阿姆斯特丹时区实际上是 03:14:35.230)。并且该方法正确地认为该时间属于4月29日而不是4月30日。

也许我错过了什么?另一方面,如果是我,我会花很长的路来避免发明一个现实生活中不存在的时区。这样的时区肯定会让您的同事感到困惑。

关于java - 在java中为 'working day'创建公司特定时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50085329/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com