gpt4 book ai didi

c# - 给定一个 DateTimeZone 和两个 Instants,确定 LocalTime 是否落在两个 Instants 之间

转载 作者:太空狗 更新时间:2023-10-30 01:20:24 26 4
gpt4 key购买 nike

对于我的每个用户,我存储一个 tzid我将其转换为 DateTimeZone持有有关其本地时区的信息。

我想在本地时间每天早上 8 点向用户发送一封电子邮件;如果上午 8 点由于某种原因(例如夏令时类)而模棱两可,我只需要选择上午 8 点中的一个;我不在乎是哪个。

我的工作每小时运行一次,我有一个 Instant包含作业的最后一次运行时间,以及另一个 Instant包含作业的下一次运行时间。

鉴于这两个 Instant称为 previousRunnextRun , 和 DateTimeZone称为 tz我如何确定 localTime称为 eightAM落在这个工作运行的界限之间?如果是,我需要向用户发送一封电子邮件。

最佳答案

Given these two Instant called previousRun and nextRun, and the DateTimeZone called tz how would I determine whether the localTime called eightAM falls between the bounds of this job run?

我认为,以一般方式执行此操作有些棘手。但是,如果您可以依赖您希望远离午夜的时间并且您的作业将每小时运行一次(因此您无需考虑如果例如,没有在午夜和早上 8 点之间运行)我认为你可以这样做:

public static bool ShouldSendEmail(Instant previousRun, Instant nextRun,
DateTimeZone zone)
{
// Find the instant at which we should send the email for the day containing
// the last run.
LocalDate date = previousRun.InZone(zone).Date;
LocalDateTime dateTime = date + new LocalTime(8, 0);
Instant instant = dateTime.InZoneLeniently(zone).ToInstant();

// Check whether that's between the last instant and the next one.
return previousRun <= instant && instant < nextRun;
}

您可以查看 InZoneLeniently 的文档来检查它会给出什么结果,但听起来您并不介意:这仍然会在一小时内每天发送一封电子邮件其中包含上午 8 点。

还没有精确地按一天中的时间对此进行参数化,因为处理一天中的时间可能接近午夜的一般情况要困难得多。

编辑:如果您可以存储“下一个发送日期”,那么这很容易 - 而且您不需要 previousRun 部分:

public static bool ShouldSendEmail(LocalDateTime nextDate, Instant nextRun,
DateTimeZone zone, LocalTime timeOfDay)
{
LocalDateTime nextEmailLocal = nextDate + timeOfDay;
Instant nextEmailInstant = nextDateTime.InZoneLeniently(zone).ToInstant();
return nextRun > nextEmailInstant;
}

基本上就是说,“确定我们下次要发送电子邮件的时间 - 如果下一次运行会晚于此时间,我们应该现在就发送。”

关于c# - 给定一个 DateTimeZone 和两个 Instants,确定 LocalTime 是否落在两个 Instants 之间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19224783/

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