У меня есть экземпляр DateTimeOffset, скажем: {11/13/2019 10:00:00 PM +02:00} Я хочу сохранить дату и время как есть и изменить смещение на +00:00 => {11/13/2019 10:00:00 PM +00:00}

c#
3
Idrees 13 Ноя 2019 в 21:04

2 ответа

Лучший ответ
// Your original input
var dto1 = DateTimeOffset.Parse("2019-11-13T22:00:00.0000000+02:00");

// Here's one way to get the value you asked for:
var dto2 = new DateTimeOffset(dto1.DateTime, TimeSpan.Zero);

// Here's another way, which does the same thing:
var dto3 = dto1.Add(dto1.Offset).ToUniversalTime();

// But note that dto2 and dto3 are a different point in time.
// The actual UTC point in time is given by:
var dto4 = dto1.ToUniversalTime();

Console.WriteLine(dto1.ToString("o")); // "2019-11-13T22:00:00.0000000+02:00"
Console.WriteLine(dto2.ToString("o")); // "2019-11-13T22:00:00.0000000+00:00"
Console.WriteLine(dto3.ToString("o")); // "2019-11-13T22:00:00.0000000+00:00"
Console.WriteLine(dto4.ToString("o")); // "2019-11-13T20:00:00.0000000+00:00"

.NET Fiddle здесь

Я также скажу, что вы, вероятно, не действительно хотите сделать это в большинстве случаев. Исходное значение дало вам местное время и смещение от UTC для этого местного времени. Изменяя смещение без изменения времени, вы фактически выбираете момент времени, который на 2 часа раньше. dto4 показывает правильное преобразование в UTC, которое также изменит время (и, возможно, дату).

3
Matt Johnson-Pint 13 Ноя 2019 в 18:27

Я считаю, что вы хотели бы что-то вроде этого:

DateTimeOffset DTO = new DateTimeOffset(2019,11,13,10,0,0,0,new TimeSpan(2, 0, 0));
DateTimeOffset newDTO= new DateTimeOffset(DTO.DateTime,new TimeSpan(0, 0, 0));
Console.WriteLine(newDTO);

В этом случае DTO будет вашим исходным экземпляром DateTimeOffset, и вы создаете новый (или перезаписывающий DTO), используя свойство DateTime объекта DTO и новый интервал времени, который соответствует +00: 00, newDTO отображает «13.11.2019 10:00: 00 +00: 00 "

1
Matías Odriozola 13 Ноя 2019 в 18:23