Подтвердить что ты не робот

Преобразование UTC DateTime в DateTimeOffset

Мне нужно преобразовать строки даты UTC в DateTimeOffsets.

Это должно работать с часовым поясом, который отличается от часового пояса компьютеров. Например. текущий часовой пояс компьютера +02: 00, но я хочу создать DateTimeOffset со смещением -4: 00.

Я уже много читал здесь вопросов о stackoverflow, но ни одна из них не решила мою проблему.

Вот что мне нужно сделать:

Вход: "2012-11-20T00: 00: 00Z"

Выход: DateTimeOffset с:

  • UtcDateTime 2012-11-20 00:00
  • правильное смещение Utc для определенного часового пояса (01:00 в этом примере)
  • LocalDateTime: 2012-11-20 01:00 (= UtcDateTime + Offset)

Конечно, необходимо учитывать летнее время.

изменить: Чтобы сделать еще более ясным, попробуйте выполнить следующий фрагмент кода:

DateTimeOffset result;
const string dateString = "2012-11-20T00:00:00Z";
var timezone = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time"); //this timezone has an offset of +01:00:00 on this date

//do conversion here

Assert.AreEqual(result.Offset, new TimeSpan(1, 0, 0));  //the correct utc offset, in this case +01:00:00
Assert.AreEqual(result.UtcDateTime, new DateTime(2012, 11, 20, 0, 0, 0)); //equals the original date
Assert.AreEqual(result.LocalDateTime, new DateTime(2012, 11, 20, 1, 0, 0));
4b9b3361

Ответ 1

Вот решение, которое вы ищете:

const string dateString = "2012-11-20T00:00:00Z";
var timezone = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time"); //this timezone has an offset of +01:00:00 on this date

var utc = DateTimeOffset.Parse(dateString);
var result = TimeZoneInfo.ConvertTime(utc, timezone);

Assert.AreEqual(result.Offset, new TimeSpan(1, 0, 0));  //the correct utc offset, in this case +01:00:00
Assert.AreEqual(result.UtcDateTime, new DateTime(2012, 11, 20, 0, 0, 0)); //equals the original date
Assert.AreEqual(result.DateTime, new DateTime(2012, 11, 20, 1, 0, 0));

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

Ответ 2

Это то, что вы хотите:

[Test]
public void ParseUtcDateTimeTest()
{
    DateTime dateTime = DateTime.Parse("2012-11-20T00:00:00Z");
    Assert.AreEqual(new DateTime(2012, 11, 20, 01, 00, 00), dateTime);
    DateTimeOffset dateTimeOffset = new DateTimeOffset(dateTime);
    Assert.AreEqual(new TimeSpan(0, 1, 0, 0), dateTimeOffset.Offset);
}
  • Обратите внимание, что мои утверждения действительны в Швеции (CET).
  • Есть пара перегрузок на DateTime.Parse()

Это полезно для вашего преобразования:

[Test]
public void ConvertTimeTest()
{
    DateTime dateTime = DateTime.Parse("2012-11-20T00:00:00Z");
    TimeZoneInfo cstZone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard     Time");
    DateTime convertedTime = TimeZoneInfo.ConvertTime(dateTime, cstZone);
    Assert.AreEqual(new DateTime(2012, 11, 19, 18, 00, 00), convertedTime);
    TimeSpan baseUtcOffset = cstZone.BaseUtcOffset;
    Assert.AreEqual(new TimeSpan(0, -6, 0, 0), baseUtcOffset);
}

Ответ 3

const String dateString = "2012-11-20T00:00:00Z"; 
var offsetDate = DateTimeOffset.Parse(dateString); 
var offsetDate2 = DateTime.Parse(dateString);

Вывод

offsetDate  {20-11-2012 0:00:00 +00:00}    System.DateTimeOffset
offsetDate2 {20-11-2012 1:00:00}           System.DateTime