根据sql中的UTC时间检查DST是否开启

时间:2013-10-27 05:01:42

标签: sql-server timezone dst

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

现在我想根据我保存的时间检查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显示巴西时间

1 个答案:

答案 0 :(得分:1)

嗯,这个特殊的代码不能用于检测巴西的DST,因为它只测量当地时间和UTC之间现在的差异,检查4小时差异。

巴西大部分时间在标准时间内落后于UTC 3小时,在白天时间落后于UTC 2小时。所以这段代码可能不适合你。您可以在this Wikipedia article中阅读更多内容。

全天候的夏令时非常不同,所以如果您打算使用这种方法,则必须修改代码以匹配运行它的服务器的时区。

就个人而言,我建议在SQL中执行此操作。时区转换实际上并不是数据库的领域。它们在应用程序代码中工作得更好。您应该在数据库中使用UTC,并将其转换为巴西或您的应用程序中所需的任何时区。

由于您说这是一个ASP.Net MVC4应用程序,我建议您使用.net TimeZoneInfo类,或使用优秀的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);

使用Noda Time

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();