С# Анализ времени UTC datetime

Я пытаюсь разобрать 11/23/2011 23:59:59 UTC +0800 как объект С# datetime, но при попытке стандартного метода анализа данных datetime или даже точного синтаксиса datetime я получаю недопустимую дату.

Любые идеи?

Ответы

Ответ 1

Я предлагаю вам разобрать DateTimeOffset вместо DateTime, как рекомендуется в MSDN при использовании спецификатора смещения часового пояса в строке формата:

using System;
using System.Globalization;

class Test
{    
    static void Main(string[] args)
    {
        string text = "11/23/2011 23:59:59 UTC +0800";
        string pattern = "MM/dd/yyyy HH:mm:ss 'UTC' zzz";

        DateTimeOffset dto = DateTimeOffset.ParseExact
            (text, pattern, CultureInfo.InvariantCulture);
        Console.WriteLine(dto);
    }
}

Затем вы можете преобразовать это значение в значение DateTime в UTC, но нет такой вещи, как "a DateTime со смещением 8 часов" - a DateTime считается либо универсальным, либо локальным или неуказан, нигде для сохранения определенного смещения.

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

Ответ 3

Как написано Джеймсом, вы можете попробовать

var dt = DateTime.ParseExact(
         "11/23/2011 23:59:59 UTC +0800", 
         "MM/dd/yyyy HH:mm:ss 'UTC' K", 
          CultureInfo.InvariantCulture);

Вы получите дату в "локальном" времени.

Ответ 4

Msdn для настроек формата: https://msdn.microsoft.com/en-us/library/az4se3k1(v=vs.110).aspx

public class Program
{
    public static void Main()
    {
         //original date
        string _date = "Thu Jan 15 11:32:09 +0200 2015";
         // Describes the date format
        string _parsePattern = "ddd MMM dd HH:mm:ss zzz yyyy"; 

         DateTimeOffset dto = DateTimeOffset.ParseExact(_date, _parsePattern, CultureInfo.InvariantCulture);

         //last settings
        Console.WriteLine(dto.ToString("dd.MM.yyyy hh:mm:ss",CultureInfo.CreateSpecificCulture("tr-TR")));
    }
}

для метода расширения:

public static DateTime getDateFromFormat(this string _date, string _parsePattern)
        {
            DateTimeOffset dto = DateTimeOffset.ParseExact(_date, _parsePattern, CultureInfo.InvariantCulture);
            return Convert.ToDateTime(dto.ToLocalTime());
        }

Для теста: https://dotnetfiddle.net/xdnjGy