代码之家  ›  专栏  ›  技术社区  ›  DigitalZebra

这是对日期时间的正确使用吗?所有时区都能用吗?

  •  0
  • DigitalZebra  · 技术社区  · 15 年前

    所以, 我将datetime对象存储为对象上的私有成员。在创建对象时设置此私有成员,如下所示:

    this.mCreateDate = DateTime.UtcNow.ToUniversalTime();
    

    现在,稍后在应用程序中,我想看看对象存活了多长时间。这可能需要数周时间(这是一个长时间运行的Web应用程序)。

    我的目标寿命是这样的:

    DateTime now = DateTime.UtcNow.ToUniversalTime();
    
    TimeSpan objectLifetime = now.Subtract(Foo.CreateDate);
    
    // Output formatted time span
    

    这一切看起来正确吗?

    3 回复  |  直到 15 年前
        1
  •  3
  •   David    15 年前

    首先,对datetime.utcnow调用touniversaltime()是多余的,因为.NET 2.0,如果源datetime对象的“kind”是“utc”,则不会发生转换。

    除此之外,这看起来还不错。

        2
  •  1
  •   Brad Heller    15 年前

    这似乎是正确的,您遵循的是日期时间的黄金法则:使用UTC,在本地显示!

        3
  •  0
  •   Sandor Drieënhuizen    15 年前

    虽然我认为使用 DateTimeOffset 结构,这是自.NET 3.5以来的新结构。

    我引用安东尼·摩尔的话:

    • 使用 数据偏移 每当你提到一个精确的时间点时。例如,使用它来计算“现在”、事务时间、文件更改时间、日志事件时间等。如果时区未知,请将其与UTC一起使用。这些用法比首选日期时间的方案更常见,因此应将其视为默认情况。
    • 对于绝对时间点不适用的任何情况,请使用日期时间:例如,跨时区应用的存储打开时间。
    • 对于互操作方案使用date time,其中信息是日期和时间,而不包含有关时区的信息,例如OLE自动化、数据库、使用date time的现有.NET API等。
    • 使用带有00:00:00时间组件的日期时间表示整个日期,例如irth日期。
    • 使用TimeSpan表示一天中没有日期的时间。

    所以你可以简单地写:

    this.mCreateDate = DateTimeOffset.Now;
    //...
    TimeSpan lifeTime = DateTimeOffset.Now - Foo.CreateDate;