编程语言
首页 > 编程语言> > c# – 给定DateTimeZone和两个Instants,确定LocalTime是否介于两个Instants之间

c# – 给定DateTimeZone和两个Instants,确定LocalTime是否介于两个Instants之间

作者:互联网

对于我的每个用户,我存储了一个tzid,我将其转换为DateTimeZone,其中包含有关其本地时区的信息.

我想在当地时间上午8点向用户发送每日电子邮件;如果上午8点因为夏令时转移等原因而模棱两可,我只需选择上午8点之一;我不在乎哪个.

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

鉴于这两个Instant称为previousRun和nextRun,而DateTimeZone称为tz,我如何判断localTime是否在这个作业运行的边界之间调用了8AM?如果是,我需要向用户发送电子邮件.

解决方法:

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,datetime,net,time,nodatime
来源: https://codeday.me/bug/20190624/1282017.html