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

Как анализировать и генерировать объекты DateTime в формате ISO 8601

Существует такая веб-служба SOAP, которая отправляет мне объекты datetime в следующем формате

2016-03-29T12:20:35.093-05:00

Это день 29 марта 2016 года. Час: 12: 20: 35.093 (GMT-5).

Я хочу создать объект DateTime, например:

DateTime.Now

и получите строковое представление в описанном выше формате, а также обратную операцию, создайте DateTime из строки, подобной приведенной выше.

Я попытался сделать следующее, чтобы создать дату:

new DateTime(2016, 3, 29, 12, 20, 35, 093, DateTimeKind.Utc)

Однако я не могу понять, как указать GMT-5 там...

Я не знаю, как конвертировать DateTime в указанный формат строки.

Используя код Nate, я делаю следующее:

var d = new DateTimeOffset(2016, 3, 29, 12, 20, 35, 93, TimeSpan.FromHours(-3));

FormatIso8601(d)

Однако этот вызов возвращается: "2016-03-29T15: 20: 35Z" вместо:

"2016-03-29T12:20:35.093-03:00"

что мне действительно нужно.

Я думаю, что это работает:

        d.ToString("yyyy-MM-ddTHH:mm:ss.fffzzz")
4b9b3361

Ответ 1

Формат, который вы описываете, ISO 8601.

Поскольку вы работаете со временными метками, которые включают компонент часового пояса, я настоятельно рекомендую использовать DateTimeOffset вместо DateTime. Это делает вещи намного проще!

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

var date = new DateTimeOffset(2016, 3, 29, 12, 20, 35, 93, TimeSpan.FromHours(-5));
// March 29, 2016 at 12:20:35.93 GMT-5

Этот код будет форматировать DateTimeOffset как ISO 8601:

public static string FormatIso8601(DateTimeOffset dto)
{
    string format = dto.Offset == TimeSpan.Zero
        ? "yyyy-MM-ddTHH:mm:ss.fffZ"
        : "yyyy-MM-ddTHH:mm:ss.fffzzz";

    return dto.ToString(format, CultureInfo.InvariantCulture);
}

И, чтобы проанализировать строку обратно на DateTimeOffset:

public static DateTimeOffset ParseIso8601(string iso8601String)
{
    return DateTimeOffset.ParseExact(
        iso8601String,
        new string[] { "yyyy-MM-dd'T'HH:mm:ss.FFFK" },
        CultureInfo.InvariantCulture,
        DateTimeStyles.None);
}

Если вам нужно вернуться к DateTime, вы можете получить это из свойства DateTimeOffset. UtcDateTime.

Ответ 2

Более простой способ - использовать метод ToString для DateTimeOffset с аргументом "o". Это автоматически печатает дату в формате ISO8601.

DateTimeOffset.Now.ToString("o");

Метод статического разбора также способен правильно анализировать дату в формате ISO8601.

DateTimeOffset.Parse("2016-25-12T20:45:30.3124+01:00");
DateTimeOffset.Parse("2016-25-12T20:45:30.3124Z");

Ответ 3

Простой ответ: DateTime.UtcNow.ToString("o")

Ответ 4

Я добавил 600 секунд. DateTime.UtcNow.AddSeconds(600).Ticks; Теперь я получаю ценность в долгосрочной перспективе. затем я преобразовал его в строковый формат следующим образом: новый DateTime (long.Parse(value), DateTimeKind.Utc).ToString("o") Теперь я хочу получить длинное значение из вновь преобразованного строкового формата. Как вернуть значение в длинном формате?