在C#中转换不同时区的时间

3

我有一个托管在远程服务器上的C# MVC Web应用程序,但我不知道其确切位置。

该应用程序的用户都来自于(UTC + 06.00)孟加拉国达卡时区。当用户插入新记录时,我希望从他所在的本地时间(即(UTC + 06.00)孟加拉国达卡时区)获取插入的日期时间。

我该怎么做?


请查看网页:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=c%23+culture+Dhaka+msdn & http://timtrott.co.uk/culture-codes/。使用以下代码: IFormatProvider provider = System.Globalization.CultureInfo.GetCultureInfo("bn-BD"); DateTime date = DateTime.Parse("6:00", provider); - jdweng
@jdweng - 很抱歉,但时区和文化是两个非常不同的事情。文化只影响日期格式,而不影响时区。 - Matt Johnson-Pint
3个回答

7
以下代码解决了我的问题-
DateTime utcTime = DateTime.UtcNow;
TimeZoneInfo BdZone = TimeZoneInfo.FindSystemTimeZoneById("Bangladesh Standard Time");
DateTime localDateTime = TimeZoneInfo.ConvertTimeFromUtc(utcTime, BdZone);

1
这对于转换来说是可以的。然而,你可能不应该在数据库中存储本地时间。在大多数情况下,你只想存储UTC并进行显示转换。有一些例外,但作为一般最佳实践,我们存储时间戳时使用UTC。 - Matt Johnson-Pint
始终显示相同的日期时间,即使系统时间已更改。您能否发布一些更方便的代码? - Mohammed Sabbir

1
您可以按照以下步骤操作:
第一步: 在数据库中存储UTC时间。如果您使用的是SQL,则可以使用GETUTCDATE()来获取UTC日期。
第二步: 请使用JavaScript设置cookie,存储浏览器时区。(您可以使用jsTimeZoneDetect这样的脚本来获取时区名称)
第三步: 后端C#代码:
1. 从cookie中取出时区。 2. 获取数据库中插入的utcTime并存储在局部变量中(我使用的是utcTime作为局部变量名称)。 3. 使用下面提到的代码将UTC时间转换为本地时间。
TimeZoneInfo tzoneinfo = TimeZoneInfo.FindSystemTimeZoneById("browser timezone name"); DateTime localTime = TimeZoneInfo.ConvertTimeFromUtc(utcTime, tzoneinfo);
最终结果是localtime. :)
希望这能帮助到您。
谢谢

除此之外,jstz 的结果在 Windows 上无法被 TimeZoneInfo 使用。您需要先从 IANA 转换为 Windows。 - Matt Johnson-Pint

0
你应该在ASP.NET应用程序中使用全局时区。查看this。这将有效,除非您仅使用C#日期时间函数。一旦在SQL Server中有一些复杂的代码将使用GETTIME函数,您也会依赖于SQL Server时区。
你应该在UTC中处理内部日期时间,并仅在UI中转换时区。

正如您链接的问题的答案所述,在asp.net应用程序中没有设置全局时区的方法。也不应该这样做。 - Matt Johnson-Pint

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接