【问题标题】:Equivalent of joda LocalTime getMillisOfDay() in noda相当于 noda 中的 joda LocalTime getMillisOfDay()
【发布时间】:2016-06-02 22:53:06
【问题描述】:

我正在将一些代码从 Java 移植到 .NET,并寻找与 LocalTime 对象的 getMillisOfDay() joda-time 方法等效的 noda-time。

是否有等效的代码或者我必须自己编写代码?

【问题讨论】:

  • 不熟悉 noda-time,millisOfDay 是从给定 DateTime 的午夜开始的毫秒数吗?
  • 是的,就是这样。
  • ...你为什么使用LocalTime?与绝对邮票(InstantDateTime)相比,这种类型的需求通常很少见。特别是因为在某些 DST 切换期间不存在午夜。
  • 此特定应用程序始终使用 LocalDate/Time,因为所有日期时间都以 UTC 格式存储。

标签: c# jodatime nodatime


【解决方案1】:

在 Noda Time 1.x 中,使用 LocalTime.TickOfDay 属性,然后将其除以 NodaConstants.TicksPerMillisecond 得到毫秒:

LocalTime localTime = ...;
long millis = localTime.TickOfDay / NodaConstants.TicksPerMillisecond;

【讨论】:

  • 谢谢 - 工作正常;虽然对于最初的问题,我认为是 TicksPerMillisecond。
【解决方案2】:

您可以通过开箱即用的 .Net 功能获得最接近 自午夜以来的毫秒数

dateTime.TimeOfDay.TotalMilliseconds

例如

double millisOfDay = DateTime.Now.TimeOfDay.TotalMilliseconds;

TimeOfDay 返回自午夜(一天中的时间)以来的 TimeSpanTotalMilliseconds 返回(名称可能已经泄露)TimeSpan 的总毫秒数。

顺便说一下,这是一个double,所以你也会得到几分之一毫秒。如果您经常需要这个,扩展方法可能会有所帮助:

public static class DateTimeExtension
{
    // should of course be in pascal case ;)
    public static int getMillisOfDay(this DateTime dateTime)
    {
        return (int) dateTime.TimeOfDay.TotalMilliseconds;
    }
}

int millisOfDay = DateTime.Now.getMillisOfDay();

【讨论】:

  • 请注意,这仅适用于您使用 UTC 或 忽略时区(使用 DateTimeKind.Unspecified,或者只是将其视为“本地”并假装时区不存在),否则这将(可能)每年返回两次错误值:DateTime,与预期相反,对所有方法和结果都是 DST/时区无知(ToUniveralTime()/@ 除外987654332@。TimeSpan 在 DST 天将短/长一个小时(假设您在一个小时不同的 DST 区域,而不是其他区域)。
猜你喜欢
  • 1970-01-01
  • 2016-07-24
  • 2013-04-17
  • 2013-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多