注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

phperwuhan的博客

记载一个phper的历程!phperwuhan.blog.163.com

 
 
 

日志

 
 

如何处理日期和时间提供了 DST  

2009-03-30 20:51:31|  分类: 技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

来源:http://support.microsoft.com/kb/932955/zh-cn

展开全部 | 关闭全部

简介

编写处理日期和时间的应用程序开发人员可以使用执行日期操作和时间操作的一个或多个技术。 特别,某些基本操作系统 API、 C 运行时 (CRT) 和 Microsoft.NET Framework 可能将转换或操作的日期和时间。 本文介绍的一些处理日期和时间中涉及的一般概念。 此外,本文介绍了有关某些产品和技术的夏令时 (DST) 2007 更改的效果。
回到顶端

更多信息



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

DST 2007 将最近更改这些复杂的 DST 规则。 启动 2007,在美国采用新的开始日期和新的结束日期 DST。 此外,是很常见的其他国家 / 地区和政府定期更改开始日期和结束日期 DST 时区受其管理的。 下面一节介绍开发人员相关的产品上的 DST 2007 更改的效果。

有关 DST 2007,请访问下面的 Microsoft Web 站点:
http://support.microsoft.com/gp/cp_dst
回到顶端

Windows Update 和 Microsoft Update,更新可用,使 Windows 正确应用更改为 DST 2007 和以下的年份。 应用这些更新后,Windows 正确地计算从 UTC 时间为本地时间当前的偏移为计算机通过 DST。 偏移量在文章 API 和网络与时间相关 API 包括偏移量。

有关详细信息,单击下面的文章编号,以查看 Microsoft 知识库中的相应:
942763  为 Microsoft Windows 操作系统的 2007 年 12 月累积时区更新

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

.NET Framework 依赖于基本的操作系统的系统调用。 因此,.NET Framework 的行为反映基础操作系统的状态。 要求没有单独的更新。

Visual Studio.NET IDE 包括 2002、 2003 和 Microsoft Visual C++、 Microsoft Visual C#,和 Microsoft Visual Basic 2005 的版本。 只是因为它们包括 CRT 影响这些产品。 要求没有特定于 IDE 的更新。

Visual Studio 2005 Team Foundation Server 依赖于基本的操作系统中的日期和时间的转换。 因此,Visual Studio 2005 Team Foundation Server 展示与操作系统相同的行为。 Visual Studio 2005 Team Foundation Server 还依赖 Microsoft SQL Server、 SQL Server Reporting Services 和 Windows SharePoint Services。 计算机应更新的操作系统、 SQL Server,和 Windows SharePoint Services 相关更新。 同时,应在所有受影响的计算机上应用所有相关的更新。 要求没有单独的 Visual Studio 2005 Team Foundation Server 更新。

Visual Studio 2005 Team System 会影响操作系统,通过 Visual Studio 2005 Team Foundation Server,和 CRT。 要求没有单独的 Visual Studio 2005 Team 系统更新。

有关 Visual SourceSafe DST 问题 2007 中的详细信息,单击下面的文章编号,以查看 Microsoft 知识库中的文章:
931804  在 2007 中的 Visual SourceSafe 夏令时问题

Visual Basic 6.0 运行时不受影响。

不再支持 Visual C++6.0。

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

此 SDK 包括 CRT 受 DST 2007 更改的一个版本。 安装的组成部分,该 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 部署到应用程序的安装文件夹的应用程序必须部署从 Visual Studio 2005 CRT 更新而不是 CRT.msm 文件,在 Windows SDK 针对 Windows Vista 的更新的 CRT。 将可再发行的 Visual Studio 2005 CRT 更新部署到 Windows 安装文件夹的应用程序必须应用到那些计算机的 Visual Studio 2005 CRT 可再发行组件更新。

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

此 SDK 包括 CRT 受 DST 2007 更改的一个版本。 安装的组成部分,该 SDK 的您可以在还没有安装 CRT 该版本的计算机上安装 Visual Studio 2005 CRT。 如果较新版本的 CRT 已安装了 SDK 安装不会覆盖该较新版本。 卸载 SDK 时, 最新版本的 CRT 是留在计算机上。 之前或之后安装 SDK,或者可能安装 Visual Studio 2005 CRT 更新。
回到顶端

应用程序通常将 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 结构。 这些函数使用 TIME _ ZONE _ INFORMATION 结构 DST 的指定开始日期和结束日期。 默认,提供没有这样的结构时使用当前的 DST 规则。
  • NetRemoteTOD() 函数是通过使用服务器已经信息和设置从远程服务器获取时间。
请注意 FileTimeToLocalFileTime() 函数和 LocalFileTimeToFileTime() 函数请使用只有当前时区信息和 DST 信息执行 UTC 时间与本地时间之间转换。 发生这种转换的而不考虑是要转换的时间戳。

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

应注意这些步骤要求您更改系统时钟。 因此,您必须退出所有应用程序,如不是执行这些步骤之前可能响应这些时间更改的日历应用程序。
  1. 更改为 DST 工作日计算机上的日期。 是例如将日期设置为 2006 年 7 月 1 中。
  2. 在同一台计算机上的 NTFS 目录中, 创建新的文本文件名为 Test.txt 的。
  3. 请注意在 Windows 资源管理器文件时间戳显示如下所示:
  4. 计算机上的日期更改为没有 DST 的工作日。 是例如将日期设置为 2007 年 2 月 1 中。
  5. 刷新 Windows 资源管理器窗口。
  6. 请注意在 Windows 资源管理器文件时间戳显示如下所示:
在此以前的示例不会更改文件上的 UTC 时间戳。 但是,将根据计算机上当前的日期变化用于将时间戳转换为本地时间的规则。 在第 3 步中 DST 偏移量被应用因为月 1 DST 范围内的范围。 在第 6 步中已应用没有 DST 偏移量,因为 2 月 1 日会不属于 DST 范围内。 以便文件时间戳可以转换确定地本地时间与本地时间,会出现此问题。

详细信息,请参阅此博客:
http://blogs.msdn.com/oldnewthing/archive/2003/10/24/55413.aspx
SystemTimeToTzSpecificLocalTime() 方法和 TzSpecificTimeToSystemTime() 方法通过提供 TIME _ ZONE _ INFORMATION 结构 UTC 时间和本地时间之间转换。 如果不提供任何时区信息,请这些函数使用当前的时区规则,并 DST 规则以确定是否有 DST 偏移量必须应用于时间戳。 这样的功能与调用 GetTimeZoneInformation() 方法以获取当前生效的 TIME _ ZONE _ INFORMATION 结构。

TIME _ ZONE _ INFORMATION 结构包括的 DST 的开始日期和结束日期。 因此,TIME _ ZONE _ INFORMATION 结构使用当前的时区信息时, TIME _ ZONE _ INFORMATION 结构可能会引入历史记录的 inaccuracy。 如果当前时区信息和 DST 信息不反映要转换的时间戳,可能会出现此问题。 此行为受 DST 2007 只是因为控制的日期时,DST 启动和停止的规则已被更改。

若要 to 从这些函数的历史上正确转换的应用程序时必须提供一个以前准确的 TIME _ ZONE _ INFORMATION 结构应用程序调用这些函数。
回到顶端

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

动态时区启用特别是对于其中每年的 DST 边界提前已知的区域设置的计算机更容易更新。 有关适用于 Vista Windows SDK 中 DYNAMIC_TIME_ZONE_INFORMATION 结构,请访问下面的 Microsoft Developer Network (MSDN) 网站:
http://msdn2.microsoft.com/en-us/library/ms724253.aspx
回到顶端

CRT 基本上有的它可以转换时间戳的三种模式:
  • 如果未设置 TZ 环境变量则 CRT 将调用 Windows API,并展示 Windows 行为,该文章中所述。
  • 如果设置了 TZ 环境变量,CRT 将执行自己的基于该设置的转换。 正在被更新 CRT,以便在这种情况下执行转换时,它遵循新的 DST 2007 规则。
  • 将如果设置,TZ 环境变量也不会是,但基本的 Windows API 失败 CRT 回退自己转换 TZ 环境变量的使用 PST8PDT。
CRT 包含自己的逻辑,用于将 UTC 转换为本地时间。 应用程序可以在从函数如 time() 函数获取 UTC 时间戳。 这些 UTC 时间戳都存储在 time_t 值中。 可以使用如 localtime_s() 函数的函数执行转换为本地时间。 localtime_s() 函数填充一个 Time.h 标头文件中定义的 tm 结构。 tm 结构基于 TZ 环境变量中定义的时区而在时间戳时生效的 DST 规则。

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

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

.NET Framework 包含存储和转换时间戳的类。 这些类包括 DateTime 类、 TimeZone 类、 在 TimeSpan 类和 DateTimeKind 类。 与以前提到这些类取决主要基础平台实现。 这些类表现出与基础操作系统 API 不同的行为。

一个有趣的行为表现由.NET Framework 新类和时间的类与请求的量偏移时间戳的函数。 例如,考虑 AddHours() 函数、 该 AddMinutes() 函数和 AddSeconds() 函数 DateTime 类中。 这些函数和相似的功能,请求量不考虑 DST 设置时只是增加时间戳。 此问题可能考虑在基础 UTC 时间戳的简单算术。 但是,此行为可能导致意外的结果添加导致传递入或移出 DST 时间戳。 这种现象是与 DST 2007 更改无关。

  • 您应该规划为附近原子 DST 2007 更新的安装。 所有计划的 DST 2007 更新应该将应用为关闭时彼此尽可能。 如果已更新的计算机尝试使用诸如 SQL 查询或 Web 服务方法与尚未更新的计算机通讯时,可能发生转换错误。 同样,一台计算机需要两个或多个更新,Windows Update 和在 CRT 更新应在同一时间应用更新。
  • UTC 时间戳是以前准确。 通常是为与大多数应用程序的本地时间转换。 应用程序应始终存储 UTC 时间戳。 出于显示目的的本地时间转换需要时区信息和 DST 的信息。 此信息可以来自多个来源:
    • 应用程序可能会使用当前时区和 DST 设置为转换。 如果当前时区和 DST 设置没有生效时间戳时,这可能会引入的 inaccuracy 转换中。
    • 应用程序可能会存储以前准确的时区信息和 DST 的信息,以及以 UTC 时间戳。
    • 有动态时区时应用程序可能使用动态时区来确定的时区信息应该应用于特定的 UTC 时间戳。 只有动态时区信息适用于特定的时间戳和特定的时区时,才可用此选项。
    • 应用程序可存储本地时间戳和 UTC 时间戳。 此方法将阻止将来的转换需要。
  • 处理时间戳的计算机之间的任何通信应使用 UTC 时间戳。 隐式这样两台计算机相同的上下文信息,为 UTC。
  • 如果应用程序处理日期,应非常谨慎与该日期的处理测试中的方式。 没有时间信息显示的日期通常存储为 12:00 AM 在相关的日期的时间戳。 因此,偏离情况的一个错误在时间戳的小时部分偏离一个结果在有效的日期如果导致时移动到 11:00 PM 在前一天。
回到顶端

参考

有关 DST 2007 Microsoft 门户的更多信息,请访问下面的 Microsoft Web 站点: http://support.microsoft.com/gp/cp_dst有关详细信息,单击下面的文章编号,以查看 Microsoft 知识库中的相应:
942763  为 Microsoft Windows 操作系统的 2007 年 12 月累积时区更新
931975  如何准备 SQL Server 2005 和 SQL Server 2000 2007 夏令时更改
931804  在 2007 中的 Visual SourceSafe 夏令时问题
有关详细信息,请访问下面的 Microsoft Developer Network (MSDN) 网站: 若要 to C 运行时 (CRT) 的 DST 2007 更新单击下面的文章编号,以查看 Microsoft 知识库中相应:
932305  FIX: Visual C++.NET 2002 C 运行时夏令时 2007 更新 TZ 环境变量问题
932304  FIX: Visual C++.NET 2002 Service Pack 1 C 运行时夏令时 2007 更新 TZ 环境变量问题
932299  FIX: Visual C++.NET 2003 C 运行时夏令时 2007 更新 TZ 环境变量问题
932298  FIX: Visual C++.NET 2003 Service Pack 1 C 运行时夏令时 2007 更新 TZ 环境变量问题
932392  TZ 环境变量的 FIX: Visual C++.NET 2005 C 运行时夏令时 2007 更新
932391  TZ 环境变量的 FIX: Visual C++.NET 2005 Service Pack 1 C 运行时夏令时 2007 更新
932590  FIX: 使用 TZ 环境变量的基于 Windows 的应用程序可能无法正常运行由于的 DST 的更改
  评论这张
 
阅读(1417)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017