【问题标题】:How to find the the start and end of a yesterday with Noda Time? [duplicate]如何用野田时间找到昨天的开始和结束? [复制]
【发布时间】:2015-06-19 00:03:18
【问题描述】:

我正在尝试使用 Noda Time 获取昨天的第一个/最后一个毫秒(这可能也适用于其他日期),我想我已经接近了,但不确定我是否做对了。

如果我可以将昨天.AtMidnight() 转换为 Ticks,那么我可以将一天中的刻度数减去 1 来给出结束时间。这有意义吗?考虑到我的要求,它是最正确的 Noda Time 用法吗?

谢谢你,斯蒂芬

//Come up with the begin and end parameters in milliseconds for a Oracle query

//Assumption is that this code will run from Midnight to 4AM
//Assumption is this application code will run on servers in the Midwest USA
//Assumption is the database servers are on the West coast USA


Instant now = SystemClock.Instance.Now;
Duration duration = Duration.FromHours(24);
LocalDate yesterday = now.InUtc().Minus(duration).Date;

Console.WriteLine(yesterday.AtMidnight());

// add a day minus one tick

更新

Noda docs 表明 Period.Between 也可能有用,所以我将对其进行测试。

【问题讨论】:

  • 你不能只使用now 并减去 1 毫秒来获得结束时间吗?
  • 啊,好消息@DavidG,我应该删除那些 cmets,因为工作可能不会在午夜开始,比如从凌晨 1 点到早上 6 点。
  • 不太确定你现在追求的是什么。您是否只想确定某个时间是否发生在某个范围内?
  • @DavidG 我想确保如果一个进程在午夜或更晚(新的一天)开始,它将正确地找到昨天的开始和结束时间戳。
  • 标记为重复,因为所有值得讨论的内容都已在该答案中。唯一的区别是 dup 谈论的是“今天”而您要求的是“昨天”,所以只需从 dup 答案中方法中的 today 变量中减去一天。

标签: c# nodatime


【解决方案1】:

似乎没有比这更困难的了:

public static void DefineYesterday( out LocalDateTime yesterdayStartOfDay , out LocalDateTime yesterdayEndOfDay )
{
  BclDateTimeZone tz         = NodaTime.TimeZones.BclDateTimeZone.ForSystemDefault() ;
  LocalDateTime   now        = SystemClock.Instance.Now.InZone(tz).LocalDateTime ;
  LocalDateTime   startOfDay = now.PlusTicks( - now.TickOfDay ) ;

  yesterdayStartOfDay = startOfDay.PlusDays(  -1 ) ;
  yesterdayEndOfDay   = startOfDay.PlusTicks( -1 ) ;

  return;
}

【讨论】:

  • 实际上,这在某些情况下是错误的,因为并非每个本地日都在午夜开始和结束。几个时区有 DST 转换,使一天从 01:00 开始或在 23:00 结束。
  • @MattJohnson 您回答的欺骗问题是否涵盖这种情况?
  • 是的,通过使用DateTimeZone.AtStartOfDay,它会考虑到这一点。
猜你喜欢
  • 2014-10-22
  • 1970-01-01
  • 2015-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多