0

我在 MVC4 项目中工作,我面临时间问题。实际上,我的项目要求是根据巴西时间显示应用程序中使用的所有时间。所以我已经用于GETUTCDATE()节省应用程序的时间。

现在我想根据我保存的时间检查 DST 是否开启……我的意思是中央时间。我如何检查这个。我在网上搜索并找到了一个解决方案

DECLARE @IsDST BIT;
SET @IsDST = CASE WHEN DateDiff(hour, GetDate(), GetUTCDate()) = 4 THEN 'True' 
             ELSE 'False' END;

SELECT GETDATE() AS GETDATE,
       GETUTCDATE() AS GETUTCDATE,
       @IsDST;

但是当我尝试运行这个脚本时,它返回 false ??

但根据 DST 计算,它总是从 3 月的第 2 个星期日开始,到 11 月的第 1 个星期日结束。

然后它应该返回 true ,即 DST 开启。

我做得对还是有另一种更好的方法来检查 DST 是否在中央时间,这样我就可以根据 DST 显示巴西时间

4

1 回答 1

1

好吧,这个特定的代码不适用于检测巴西的 DST,因为它现在只是测量当地时间和 UTC 之间的差异检查是否有 4 小时的差异。

巴西大部分地区的标准时间比 UTC 时间晚 3 小时,白天时间比 UTC 时间晚 2 小时。所以这段代码可能不适合你。您可以在此 Wikipedia 文章中阅读更多内容。

世界各地的夏令时都非常不同,因此如果您打算使用这种方法,则必须修改代码以匹配运行它的服务器的时区。

就个人而言,我建议根本不要在 SQL 中这样做。时区转换并不是真正的数据库领域。它们在应用程序代码中工作得更好。您应该在数据库中使用 UTC,并将其转换为巴西或您的应用程序中需要的任何时区。

既然你说这是一个 ASP.Net MVC4 应用程序,我建议你要么使用 .netTimeZoneInfo类,要么使用优秀的Noda Time库在你的 .Net 代码中进行转换。

使用TimeZoneInfo

DateTime utcDT = // ... your UTC value returned from the database
TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById(
                             "E. South America Standard Time");     // Brazil
DateTime brazilDT = TimeZoneInfo.ConvertTimeFromUtc(utcDT, tz);

使用野田时间

DateTime utcDT = // ... your UTC value returned from the database
Instant instant = Instant.FromDateTimeUtc(utcDT);
DateTimeZone tz = DateTimeZoneProviders.Tzdb["America/Sao_Paulo"];  // Brazil
ZonedDateTime brazilZDT = instant.InZone(tz);
DateTime brazilDT = brazilZDT.ToDateTimeUnspecified();
于 2013-10-27T06:12:45.337 回答