C # Datetimes: преобразование для разных часовых поясов - PullRequest
10 голосов
/ 13 июля 2011

У меня есть куча дат, которые я отслеживаю для своего приложения. Они все в UTC времени. Для части моего приложения я хочу отправить электронное письмо с одним из этих времен, но отредактировано так, чтобы оно находилось в этом конкретном часовом поясе.

Есть только две основные области, с которыми я буду иметь дело: восточное побережье и Техас (Даллас и Хьюстон)

Я также могу указать новое время и дату, когда отправлю это электронное письмо, чтобы получить восточный часовой пояс (DateTime timestamp = DateTime.Now;)

Мой вопрос такой:

Если пользователь находится в зоне Техаса, как я могу перевести свое время с восточного на это время (на 1 час меньше)?

Я пробовал что-то вроде этого:

            //Convert timestamp to local time
            TimeSpan ts = TimeZone.CurrentTimeZone.GetUtcOffset(timestamp);
            timestamp.Add(ts);

            timestampString = timestamp.ToString();

Но это не сработало. Я также знаю, что эта строка недействительна:

timestamp.Hour = timestamp.Hour - 1;

Ответы [ 6 ]

15 голосов
/ 13 июля 2011

Используйте класс TimeZoneInfo , чтобы преобразовать местное время во время в альтернативном часовом поясе:

TimeZoneInfo est = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
DateTime targetTime = TimeZoneInfo.ConvertTime(timeToConvert, est);
5 голосов
/ 13 июля 2011
    var now = DateTime.Now; // Current date/time
    var utcNow = now.ToUniversalTime(); // Converted utc time
    var otherTimezone = TimeZoneInfo.FindSystemTimeZoneById("ANY OTHER VALID TIMEZONE"); // Get other timezone
    var newTime = TimeZoneInfo.ConvertTimeFromUtc(utcNow, otherTimezone); // New Timezone
3 голосов
/ 13 июля 2011

Это должно сработать

DateTime localTime = TimeZoneInfo.ConvertTime(DateTime.UtcNow, TimeZoneInfo.Local);
1 голос
/ 13 июля 2011

Использовать TimeZoneInfo.ConvertTimeFromUtc .Приведенный здесь пример говорит сам за себя.

0 голосов
/ 03 августа 2017

почему бы не просто

TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTime.UtcNow, "AUS Eastern Standard Time");

и проверить получить все доступные часовые пояса

foreach (TimeZoneInfo tz in TimeZoneInfo.GetSystemTimeZones())
{
    Console.WriteLine(tz.Id);
}
0 голосов
/ 13 июля 2011

Вы можете использовать javascript:

 var visitortime = new Date();
    vat time = visitortime.getTimezoneOffset()/60;

После этого вы можете сохранить это значение в любом скрытом элементе управления runat = "server".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...