如何在客户时区显示日期和时间

时间:2017-08-07 11:33:58

标签: c# asp.net sql-server model-view-controller

假设服务器位于美国(MST),并且来自Chennai(IST)的用户正在付款。服务器和用户都在不同的时区。 MST(山地标准时间)比格林威治标准时间(Greenwich Meridian Time)落后7小时,IST(印度标准时间)比GMT早5.30小时,即服务器和用户的时差为12:30小时。如果用户在9/20/2011 9:00 AM付款,那么服务器上的时间是8/20/2011晚上8:30。那么你必须在数据库中记录哪个时间?如果应用程序将用户的时间存储在数据库中,那么如果来自美国的某人看到该交易可能会看到错误的时间,即8/20/2011晚上8:30。另一个选择是将服务器的时间存储在数据库中(我们通常会这样做),然后用户会在看错时间时感到不快。

你能帮我吗?非常感兴趣。

2 个答案:

答案 0 :(得分:2)

我总是使用 UTC时间来记录任何计算机/服务器中的所有内容。

DateTime.UtcNow

然后,当我向某个用户显示日期和时间时,我只是根据当地时区进行更改。

答案 1 :(得分:1)

保存任何日期会将其转换为 UTC 并保存到数据库中,例如;

var now = DateTime.Now;
var Date = now.ToUniversalTime();

OR

var Date = DateTime.UtcNow;

并在显示日期时获取用户的当前时区并使用它来转换UTC日期

 var _Timezone = // store timezone id here
 var southPole = TimeZoneInfo.FindSystemTimeZoneById(_Timezone);
 DateTime userTime = TimeZoneInfo.ConvertTimeFromUtc(Date , southPole);

您可以将不同用户的时区存储在数据库中,或获取登录用户的当前时区;

var _Timezone = new Date().getTimezoneOffset();

此方法不适用于服务器端,

注意

您可以从此代码中获取时区列表

var timeZones = System.TimeZoneInfo.GetSystemTimeZones();

foreach ( var timeZone in timeZones )
{
    Console.WriteLine( "{0} - {1}", timeZone.Id,  timeZone.DisplayName );
}