如何处理日期和时间,包括 DST

文章翻译 文章翻译
文章编号: 932955 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

简介

开发人员编写处理日期和时间的应用程序可能使用一个或多个技术,执行日期操作和时间操作。 在具体的而言某些基本操作系统 api、 C 运行时 (CRT) 和 Microsoft.net 框架可能转换或其他方式操作的日期和时间。本文介绍的一些在处理中日期和时间所涉及的一般概念。 此外,本文还介绍了夏令时 (DST) 2007年更改的效果上特定产品和技术。

更多信息

时间存储和操作

时间戳都是指定日期和时间组合的值。通常必须处理的时间戳的应用程序存储这些时间戳在协调通用时间 (UTC)。 UTC 是通用的 UTC 优点。 UTC 是不属于本地时区或到 DST。 但是,UTC 是用户友好和与大多数用户都没有。 UTC 是用于存储选择,但不是一个很好的选择,用于显示。 将因此,大多数应用程序 UTC 时间转换为本地时间,才能向用户显示时间戳。 例如对于 Windows 资源管理器应用时区和 DST 设置为 UTC 时间戳在 Windows NT 文件系统 (NTFS) 目录中显示文件的日期和时间之前。

UTC 时间转换为本地时间可以被认为是应用两个偏移量。 第一个是时区偏移量和第二个是 DST 偏移量。 因此,本地时间是有效 UTC 时间加上一个时区偏移量加上任何适用的 DST 偏移量。 时区偏移量是相当简单。 将计算机配置为一个特定的时间区域且该时区从 UTC 偏移量。 若要确定是否应该应用 DST 偏移量是复杂得多。该活动依赖于很多的复杂、 动态规则。

这些复杂的 DST 规则使用 DST 2007 最近已更改。 从 2007年开始在美国采用新的开始日期和新的结束日期的 DST。 此外,它是常见的其他国家/地区和政府的 DST 他们控制的时区中经常需要更改开始日期和结束日期。 以下部分描述与开发人员相关的产品的 DST 2007 更改效果。

有关 DST 2007 的详细信息,请访问下面的 Microsoft 网站:
http://support.microsoft.com/gp/cp_dst

与开发人员相关的技术的 DST 2007 影响

Windows

在 Windows 更新和 Microsoft 更新,有可用的更新,使 Windows 能够正确地应用针对 DST 2007 和以下年中的更改。 应用这些更新后,Windows 计算机通过 DST 正确地计算该当前 UTC 时间从偏移量为本地时间。 偏移量包括偏移量为基的 api 和网络与时间相关的 api。

有关详细的信息请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
9427632007 年十二月的累积时区更新 (对于 Microsoft Windows 操作系统

C 运行库 (CRT)

翻译日期和时间转换,还会执行 CRT。 因此,CRT 还必须更新以包括新的 DST 2007 规则。 CRT 执行处理只有当 TZ 环境变量设置时或当一个基础操作系统 API 时间调用失败时自己的时间。 更新都可以为所包含的每个版本的 Microsoft Visual Studio CRTs 和还附带 Windows CRTs。 这些更新使 CRT 继续正确地处理在美国时区的 DST 转换。

.NET 框架

.NET 框架依赖于基础操作系统调用。 因此,.net 框架的行为反映了基础操作系统的状态。 没有单独的更新是必需的。

visual Studio.net 集成开发环境 (ide)

Visual Studio.net ide 包括版本 2002年、 2003,和 Microsoft Visual c + +、 Microsoft Visual C#,和 Microsoft Visual Basic 2005。 只是因为它们包含 CRT,这些产品会受到影响。没有特定于 IDE 的更新是必需的。

visual Studio 2005 团队基础服务器

visual Studio 2005 团队基础服务器依赖于日期和时间转换为基础操作系统。 因此,Visual Studio 2005 团队基础服务器表现出与操作系统相同的行为。 visual Studio 2005 团队基础服务器还依赖于 Microsoft SQL Server、 SQL Server 报表服务,和 Windows SharePoint Services。 计算机应使用相关的更新操作系统、 SQL Server,和 Windows SharePoint Services 进行更新。 在同一时间,应该在所有受影响的计算机上应用所有相关的更新。没有单独的 Visual Studio 2005 团队基础服务器更新是必需的。

visual Studio 2005 Team System

通过操作系统、 通过 Visual Studio 2005 团队基础服务器,和通过 CRT,visual Studio 2005 Team System 受到影响。 没有单独的 Visual Studio 2005 Team System 更新是必需的。

visual SourceSafe

在 2007 年 Visual SourceSafe DST 问题的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
931804在 2007 年的 visual SourceSafe 夏时制时间问题

Visual Basic 6.0 运行时

Visual Basic 6.0 运行时不会受到影响。

visual c + + 6.0

visual c + + 6.0 不再受支持。

有关详细的信息,请访问下面的 Microsoft 网站:
http://support.microsoft.com/lifecycle/

Windows 软件开发工具包 (SDK) 的 Windows Vista

此 SDK 包括受 DST 2007 更改影响的 CRT 的版本。一部分安装的此 SDK,您可以在尚不具有的 CRT 安装该版本的计算机上安装 Visual Studio 2005 CRT。如果已安装较新版本的 CRT,则 SDK 安装不会覆盖较新版本。在卸载 SDK 时在计算机上保持最新版本的 CRT。之前或之后安装 SDK,或者可能安装 Visual Studio 2005 CRT 更新。

在 Windows SDK 的 Windows Vista 还安装 Visual Studio 2005 CRT 的 CRT 作为自定义的 c + + 应用程序的一部分的再发行的合并模块 (.msm 文件) 的一组。 将可再发行的 CRT 部署到应用程序的安装文件夹的应用程序必须在部署更新的 CRT 的 CRT.msm 文件,从该 Windows SDK 的 Windows Vista 而不是在 Visual Studio 2005 CRT 更新中。 将可再发行的 Visual Studio 2005 CRT 更新部署到 Windows 安装文件夹的应用程序必须将 Visual Studio 2005 CRT 可再发行更新应用到这些计算机。

平台 SDK 的 Microsoft Windows Server 2003 R2

此 SDK 包括受 DST 2007 更改影响的 CRT 的版本。 客户必须遵循此 SDK 发行说明,并在需要时使用 Visual Studio 2005 CRT 更新。

.NET Framework 2.0 SDK

此 SDK 包括受 DST 2007 更改影响的 CRT 的版本。一部分安装的此 SDK,您可以在尚不具有的 CRT 安装该版本的计算机上安装 Visual Studio 2005 CRT。如果已安装较新版本的 CRT,则 SDK 安装不会覆盖较新版本。在卸载 SDK 时在计算机上保持最新版本的 CRT。之前或之后安装 SDK,或者可能安装 Visual Studio 2005 CRT 更新。

在 Windows 中的本地时间转换

应用程序通常将 UTC 时间转换为本地时间,才能向用户显示时间信息和日期信息。 Windows 提供了几个应用程序使用的时间戳操作的 api。
  • GetSystemTime() 函数和 GetSystemTimeAsFileTime() 函数获得当前 UTC 时间 SYSTEMTIME 结构中或在 FILETIME 结构中。
  • GetLocalTime() 函数获取当前的本地时间,SYSTEMTIME 结构中。
  • GetTimeZoneInformation() 函数获取描述当前时区和 DST 设置计算机的一个 TIME_ZONE_INFORMATION 结构。
  • SystemTimeToFileTime() 函数和 FileTimeToSystemTime() 函数封送处理 SYSTEMTIME 结构和 FILETIME 结构之间。
  • FileTimeToLocalFileTime() 函数和 LocalFileTimeToFileTime() 函数转换,并通过使用在计算机上的当前时区和 DST 设置翻译 UTC 与本地时间之间的一个 FILETIME 结构。
  • SystemTimeToTzSpecificLocalTime() 函数和 TzSpecificTimeToSystemTime() 函数将 UTC 时间戳在 SYSTEMTIME 结构转换为本地 SYSTEMTIME 结构。这些函数使用指定的 DST 的开始日期和结束日期的 TIME_ZONE_INFORMATION 结构。默认状态下,如果没有此类结构则使用当前的 DST 规则。
  • NetRemoteTOD() 函数通过使用服务器的信息和设置从远程服务器中获得时间。
注意FileTimeToLocalFileTime() 函数和 LocalFileTimeToFileTime() 函数请通过只是当前的时区信息和 DST 信息执行 UTC 时间与本地时间之间的转换。 无论要转换成的时间戳进行此转换。

若要查看此行为在 Windows 资源管理器中的示例,请按照下列步骤操作驻留在使用 DST 的时区中的计算机上。

注意这些步骤要求您更改系统时钟。因此,您必须退出所有的应用程序如之前请按照下列步骤可能对这些时间更改作出反应的日历应用程序。
  1. 在计算机上的将日期更改为 DST 日期。 例如对于设置为 2006 年 7 月 1 的日期。
  2. 在同一台计算机上的 NTFS 目录中创建一个新文本文件,并在名为 Test.txt 的。
  3. 请注意在 Windows 资源管理器中,如下所示显示文件时间戳:
    2006 年七月 1 日下午 3: 37
  4. 在计算机上的将日期更改为非 DST 日期。 例如对于 2007 年 2 月 1 设置日期。
  5. 刷新 Windows 资源管理器窗口。
  6. 请注意在 Windows 资源管理器中,如下所示显示文件时间戳:
    2006 年七月 1 日下午 2: 37
在此前一示例 UTC 时间戳在文件上的不会更改。但是,规则用来转换为本地时间的时间戳的更改取决于当前日期在计算机上。 在步骤 3 中,因为 7 月 1 日的范围,DST 范围内,所以,DST 偏移量被应用。 第 6 步中,没有 DST 的偏移量被应用,因为 2 月 1 日没有 DST 范围内。 以便为本地时间和从本地时间,可以将文件时间戳转换明确,会出现这种情况。

有关详细的信息,请参阅此网络日志:
http://blogs.msdn.com/oldnewthing/archive/2003/10/24/55413.aspx
SystemTimeToTzSpecificLocalTime() 方法和 TzSpecificTimeToSystemTime() 方法转换 UTC 时间和本地时间之间使用提供的 TIME_ZONE_INFORMATION 结构。 如果不提供任何时区信息,则这些函数使用当前的时区规则,以确定是否有 DST 偏移量的 DST 规则,必须将应用于该时间戳。这是功能上等效于调用以获取当前正在生效的 TIME_ZONE_INFORMATION 结构 GetTimeZoneInformation() 方法。

TIME_ZONE_INFORMATION 结构包括 DST 的开始日期和结束日期。因此,当 TIME_ZONE_INFORMATION 结构使用当前的时区信息,TIME_ZONE_INFORMATION 结构可能会引入历史的错误。如果当前的时区信息和 DST 信息不会反映正在转换的时间戳,则可能会发生此行为。此行为受 DST 2007 影响只是因为控制的日期 DST 的开始和停止时规则已被更改。

当应用程序调用这些函数时,获取从这些函数的过去准确转换,应用程序必须提供过去准确 TIME_ZONE_INFORMATION 结构。

在 Windows 中的动态时区

Windows Vista 引入了动态 DST 的时区。动态 DST 的时区的 DST 其边界更改年从提供的支持。这些规则存储在注册表中。应用程序可以查询此规则使用 GetDynamicTimeZoneInformation() 函数。

动态时区启用的特别是对于其中每年的 DST 边界提前获知的区域设置的计算机更容易更新。 有关适用于 Vista Windows SDK 中 DYNAMIC_TIME_ZONE_INFORMATION 结构的详细信息,请访问下面的 Microsoft 开发人员网络 (MSDN) 的网站:
http://msdn2.microsoft.com/en-us/library/ms724253.aspx

C 运行库 (CRT) 中的本地时间转换

CRT 基本上有三种模式,它可以在其中翻译时间戳:
  • 如果未设置 TZ 环境变量,则 CRT 调用 Windows api,并展示 Windows 行为,如本文所述。
  • 如果 TZ 环境变量设置,CRT 执行其自己的基于该设置的转换。 正在更新 CRT,以便它会考虑新的 DST 2007 规则,在这种情况下执行转换时。
  • 如果 TZ 环境变量未设置,但基础 Windows api 失败 CRT 回到其自己的转换通过使用值为 PST8PDT TZ 环境变量。
CRT 包含其自身逻辑将 UTC 转换为本地时间。 应用程序可以从函数如 time() 函数获取 UTC 时间戳。 这些 UTC 时间戳都存储在 time_t 值。 可使用如 localtime_s() 函数的函数来执行转换为本地时间。 localtime_s() 函数填充 tm 结构 Time.h 头文件中定义的。tm 结构根据 TZ 环境变量中定义的时区和有效时的时间戳的 DST 规则。

注意这种转换到美国遵循特定的规则。

在应用 DST 2007 更新之前,CRT 正确处理美国时区中的当前时间戳。 应用 DST 2007 更新后,CRT 还处理过去和将来的美国日期。 参考一节中列出的 CRT 更新。

.NET 框架中的本地时间转换

.NET 框架包含的存储和转换时间戳类。 这些类包括 DateTime 类、 时区 类、 TimeSpan 类和 DateTimeKind 类。 作为以前设定主要上基础平台实现取决于这些类。 这些类与基础操作系统 api 的行为相同。

一种有趣的行为表现.net 框架日期类和时间类与偏移量按所请求的数量的时间戳的函数。 例如对于考虑 AddHours() 函数、 AddMinutes() 函数和 AddSeconds() 函数 DateTime 类中。 这些函数和类似方式命名的函数只是将时间戳递增而不考虑 DST 设置请求量。此行为可能会被视为简单的算术运算的基础的 UTC 时间戳。 但是,此行为可能会导致意外的结果时添加会导致传递中的接入或接出的 DST 时间戳。 此行为与 DST 2007 更改无关。

建议

下面的建议可以帮助开发人员的 DST 2007 影响降到最低程度并提高常规日期和时间处理。
  • 您应计划进行附近原子 DST 2007 更新的安装。 所有计划的 DST 2007 更新应该为关闭的时间到另一个尽可能。如果已更新的计算机将尝试使用与尚未更新的计算机进行通信的方法 (如 SQL 查询或 Web 服务,可能会出现转换错误。同样,如果一台计算机需要两个或多个更新 Windows 更新和 CRT 更新等更新应该应用一次。
  • UTC 时间戳已过去准确。 它通常是转换为涉及大多数应用程序的本地时间。 应用程序应始终将存储 UTC 时间戳。 为本地时间,用于显示目的的转换需要 DST 信息和时区信息。 此信息可以来自多个源:
    • 应用程序可能将用于转换的当前时区和 DST 设置。 如果当前时区和 DST 设置都不是有效的时间戳时,这可能会引入转换中的一个错误。
    • 应用程序可能会存储以前准确的时区信息和 DST 除了 UTC 时间戳的信息。
    • 有动态时区时应用程序可能使用动态时区来确定哪个时区信息之前,应将应用于特定的 UTC 时间戳。 只有在可用于特定的时间戳和针对特定时区动态时区信息时,此选项才可用。
    • 应用程序可能会存储一个本地时间戳和 UTC 时间戳。此方法防止需未来的转换。
  • 处理时间戳的计算机之间的任何通信应该使用 UTC 时间戳。 这隐式地使两台计算机的 UTC 相同的上下文信息。
  • 如果应用程序处理日期,您应仔细测试过程中处理日期的方式。 通常没有时间信息的情况下显示的日期存储为相关的日期在 12: 00 AM 的时间戳。 因此,小时部分中的时间戳关闭的情况的一个错误如果可能导致不关闭由-一结果中生效的日期时间即会移至前一天的下午 11: 00。

参考

有关在 DST 2007 Microsoft 门户的详细信息,请访问下面的 Microsoft 网站: http://support.microsoft.com/gp/cp_dst有关详细的信息请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
9427632007 年十二月的累积时区更新 (对于 Microsoft Windows 操作系统
931975如何在 2007 年夏时制时间更改为准备 SQL Server 2005 和 SQL Server 2000
931804在 2007 年的 visual SourceSafe 夏时制时间问题
有关更多的信息,请访问下面的 Microsoft 开发人员网络 (MSDN) 的网站:
http://msdn2.microsoft.com/en-us/library/ms724277.aspx

http://msdn2.microsoft.com/en-us/library/ms724490.aspx

http://msdn2.microsoft.com/en-us/library/ms725473.aspx
若要获取的 C 运行时 (CRT) 的 DST 2007 更新,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
932305FIX: Visual c + +.net 2002 C 运行时夏令时 2007年更新 TZ 环境变量问题
932304FIX: Visual c + +.net 2002年服务包 1 C 运行时夏令时 2007年更新 TZ 环境变量问题
932299FIX: Visual c + +.net 2003 C 运行时夏令时 2007年更新 TZ 环境变量问题
932298FIX: Visual c + +.net 2003年服务包 1 C 运行时夏令时 2007年更新 TZ 环境变量问题
932392TZ 环境变量的的 FIX: Visual c + +.net 2005 C 运行时夏令时 2007年更新
932391TZ 环境变量的的 FIX: Visual c + +.net 2005年服务包 1 C 运行时夏令时 2007年更新
932590FIX: 使用 TZ 环境变量的基于 Windows 的应用程序可能无法按预期的方式工作的 dst 更改

属性

文章编号: 932955 - 最后修改: 2008年1月15日 - 修订: 5.2
这篇文章中的信息适用于:
  • The C Run-Time (CRT)
  • Microsoft Visual Studio 2005 Service Pack 1
  • Microsoft Visual Studio 2005 Team Foundation Server
  • Microsoft Visual Studio 2005 Team System Team Foundation:
  • Microsoft Visual Studio 2005 Standard Edition
  • Microsoft Visual Studio 2005 Professional
  • Microsoft Visual Studio 2005 Express Edition
  • Microsoft Visual Studio .NET 2003 Service Pack 1
  • Microsoft Visual Studio .NET 2003 Professional Edition
  • Microsoft Visual Studio .NET 2003 Enterprise Architect
  • Microsoft Visual Studio .NET 2003 Enterprise Developer
  • Microsoft Visual Studio .NET 2003 Academic Edition
  • Microsoft Visual Studio .NET 2002 专业版
  • Microsoft Visual Studio .NET (2002), Enterprise Architect Edition SP1
  • Microsoft Visual Studio .NET 2002 企业级开发版
  • Microsoft Visual Studio .NET 2002 企业级结构设计版
  • Microsoft Visual Studio .NET 2002 Academic Edition
关键字:?
kbmt kbinfo kbhowto KB932955 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 932955
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com