как перевести время на сервере местное время

У меня проблема со временем
Мой сервер находится в США, и я в Дании (Европа), и я хотел бы, чтобы мой сайт показывал время в моем местном времени. Как я могу это сделать?

Я пробую это

Datetime localtime = DateTimeOffset.Now.ToOffset(new TimeSpan(1,0,0)).DateTime;

и он работает, но он будет работать только тогда, когда я в GMT+1 / UTC+1, а не когда я в GMT+2 / UTC+2. Есть ли другой способ сделать это-более простой способ сделать это?

4 ответов


единственный способ сделать это следующим образом:

string zoneId = "Central European Standard Time";
TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById(zoneId);
DateTime result = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow,tzi);
Console.WriteLine("Time is " + result + " in Denmark");

использование класса TimeZoneInfo-единственный надежный способ в .Net конвертировать в / из разных часовых поясов и получать правильные преобразования DST.

TimeZoneInfo.ConvertTimeToUtc(dtLocal,tzi) является обратным преобразованием из локального времени в время utc.


для строк идентификатора часового пояса вы можете запустить бит кода здесь...

foreach( var tz in TimeZoneInfo.GetSystemTimeZones() )
{
    Console.WriteLine(tz.DisplayName + " is Id=','" + tz.Id + "'");
}

Вы можете получить время с сервера и сделать это.

DateTime myTimeGMT = ServerTime.ToUniversalTime();

этого этого:

DateTime myTimeLocal = myTimeGMT.ToLocalTime();

единственное ограничение здесь-компьютер, на котором вы находитесь, должен быть установлен в часовой пояс, в который вы конвертируете.

по моему опыту, .NET имеет проблемы с преобразованием между часовыми поясами, когда ни время "от", ни время " до " не являются локальным часовым поясом.

надеюсь, это поможет.


Я сделал преобразование, которое будет отображаться в GridView используя поле шаблона.

<asp:TemplateField HeaderText="Last Activity">
                <ItemTemplate>
                    <asp:Label ID="LastActivityLBL" runat="server" Text='<%# Convert.ToDateTime(Eval("LastActivityDate")).ToLocalTime() %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Last Login">
                <ItemTemplate>
                    <asp:Label ID="LastLoginLBL" runat="server" Text='<%# Convert.ToDateTime(Eval("LastLoginDate")).ToLocalTime() %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>

Datetime localtime = DateTimeOffset.Now.ToOffset(new TimeSpan(1,0,0)).DateTime;

Вы можете изменить промежуток времени, как...

Datetime localtime = DateTimeOffset.Now.ToOffset(new TimeSpan(3,0,0)).DateTime;

согласно часовому поясу.