Как преобразовать эту строку даты и времени UTC в объект DateTime c # - PullRequest
0 голосов
/ 01 ноября 2019

Я пытался преобразовать эту строку в объект DateTime в C #

2019-09-23T08: 34: 00UTC + 1

Я пытался использовать DateTime.Parse, но этовыдает исключение для

"Строка не была распознана как допустимый DateTime."

Ответы [ 2 ]

2 голосов
/ 01 ноября 2019

Извините, но вы кажетесь жертвой мусора, мусора .

Это необычный формат, поэтому прежде чем я предлагаю решениедля вас первое, что я хочу сказать: «Сначала исправьте ввод, если вы можете ».

Допустим, вы не можете исправить ввод, а затем вынужно учесть несколько вещей;

  1. Прежде всего, если в вашей строке есть такие части, как UTC и / или GMT, не существует специального спецификатора формата даты и времени для их анализа. Вот почему вы должны экранировать их как строковый литерал . См. Этот вопрос для получения более подробной информации. .
  2. Во-вторых, ваша +1 деталь выглядит как UTC Offset . Спецификатор формата "z" - это то, что вам нужно для его анализа, но будьте осторожны, этот спецификатор формата не рекомендуется для использования со значениями DateTime, так как не делаетt отражает значение свойства Kind экземпляра .

В качестве решения для DateTime вы можете проанализировать его, как я бы предложил;

var s = "2019-09-23T08:34:00UTC+1";
DateTime dt;
if(DateTime.TryParseExact(s, "yyyy-MM-dd'T'HH:mm:ss'UTC'z", CultureInfo.InvariantCulture,
                          DateTimeStyles.AdjustToUniversal, out dt))
{
    Console.WriteLine(dt);
}

, который дает 2019-09-23 07:34:00 как DateTime и который имеет Utc как Kind свойство.

Как решение для DateTimeOffset - поскольку ваша строка имеет UTCЗначение смещения, которое вы должны рассмотреть для анализа, а не Datetime - как заметил Мэтт , вы можете использовать его .DateTime свойство , чтобы получить такие данные как;

var s = "2019-09-23T08:34:00UTC+1";
DateTimeOffset dto;
if(DateTimeOffset.TryParseExact(s, "yyyy-MM-dd'T'HH:mm:ss'UTC'z", CultureInfo.InvariantCulture,
                          DateTimeStyles.None, out dto))
{
    Console.WriteLine(dto.DateTime);
}

, который дает тот же результат DateTime, но Unspecified как свойство .Kind.

Но, опять же, я настоятельно предлагаюсначала исправить ввод.

0 голосов
/ 01 ноября 2019

Используйте TryParseExact для преобразования строки в дату и время. Вот пример кода, чтобы преобразовать данный формат (ы) в datetime

private static DateTime ParseDate(string providedDate) {
    DateTime validDate;
    string[] formats = {
        "yyyy-MM-ddTHH:mm:ss"
    };
    var dateFormatIsValid = DateTime.TryParseExact(
    providedDate, formats, CultureInfo.InvariantCulture, DateTimeStyles.None, out validDate);

    return dateFormatIsValid ? validDate: DateTime.MinValue;
}

Затем используйте эту функцию для преобразования строки. Я заменяю UTC + 1 на пустую строку

static void Main(string[] args) {
    string strdatetime = "2019-09-23T08:34:00UTC+1";
    DateTime dateTime = ParseDate(strdatetime.Replace("UTC+1", ""));

    Console.WriteLine(dateTime);
}
...