Ошибка при преобразовании указанной c даты в Сидней с использованием кода c# - PullRequest
0 голосов
/ 27 апреля 2020

Используя приведенный ниже код, я пытаюсь преобразовать указанное c время в Сидней.

string datetime = "20200424-04:09:42.145";
datetime  = datetime.Replace("-", " ").Insert(4, "-").Insert(7, "-");
TimeZoneInfo dest = TimeZoneInfo.FindSystemTimeZoneById("AUS Eastern Standard Time");
TimeZoneInfo src = TimeZoneInfo.FindSystemTimeZoneById("Greenwich Standard Time");
DateTime convertTime = TimeZoneInfo.ConvertTimeToUtc(Convert.ToDateTime(datetime), src);
DateTime transactTime = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(convertTime, dest.Id);

Получение неверного формата вывода - 24.04.2020 14:09:42 PM.145

Системный формат даты, формат дд / мм / гггг и время в 24 часа

1 Ответ

1 голос
/ 27 апреля 2020

Несколько вещей:

  • Этот формат ввода нестандартный и немного странный. Если вы можете изменить, где бы он ни был построен, это был бы лучший подход. В то же время я предлагаю вам разобрать его с DateTime.ParseExact вместо замены символов, чтобы Convert.ToDateTime распознал его.

  • Greenwich Standard Time - это идентификатор часового пояса для Монровии ( Либерия) и Рейкьявик (Исландия) (и несколько других). Я подозреваю, что вы на самом деле пытаетесь конвертировать из GMT / UT C в Сиднейское время. Если это так, вам нужна только одна функция преобразования - ConvertTimeFromUtc.

  • Вы говорите, что получаете неверный формат вывода, но не показываете, как его создать. Я предполагаю, что вы делаете что-то вроде Console.WriteLine(transactTime) или просто помещаете transactTime в другое место, которое преобразует его в строку. При этом он будет использовать общий формат, контролируемый текущей культурой. (См. Раздел Remarks в документации DateTime.ToString .)

  • Звучит так, будто вместо этого вы хотели бы указать определенный формат c, который вы можете получить, указав желаемый результат в методе ToString. Вы можете указать токен стандартного формата (обычно используется с текущей культурой) или собственные токены нестандартного форматирования (обычно используются с InvariantCulture).

Полный пример, иллюстрирующий вышеприведенные пункты:

// Parse the input string to a DateTime, from a given format
DateTime dt = DateTime.ParseExact("20200424-04:09:42.145", "yyyyMMdd-HH:mm:ss.fff", CultureInfo.InvariantCulture);

// Convert the datetime from UTC to Sydney time
TimeZoneInfo dest = TimeZoneInfo.FindSystemTimeZoneById("AUS Eastern Standard Time");
DateTime transactTime = TimeZoneInfo.ConvertTimeFromUtc(dt, dest);

// Create and output the string you want to output, in a specific format
string output = transactTime.ToString("yyyy-MM-dd HH:mm:ss.fff", CultureInfo.InvariantCulture);
Console.WriteLine(output);

// Output:  "2020-04-24 14:09:42.145"

( Работает. NET Скрипка здесь. )

...