2017-01-17 8 views
1

Я пытаюсь преобразовать свои данные в DateTime и AssumeUniversal, но я получаю ошибкуПреобразовать в UTC время

Строка не была признана в качестве действительного DateTime

Это формат который передается в

1/10/2017 1:13:00 PM 

Это мой Track Event класс

public partial class TrackEvent { 
    private System.DateTime timestampField; 
    private bool timestampFieldSpecified; 
    private string eventTypeField; 
    private string eventDescriptionField; 
    private string statusExceptionCodeField; 
    private string statusExceptionDescriptionField; 
    private Address addressField; 
    private string stationIdField; 
    private ArrivalLocationType arrivalLocationField; 
    private bool arrivalLocationFieldSpecified; 

    /// <remarks/> 
    public System.DateTime Timestamp { 
     get { 
      return this.timestampField; 
     } 
     set { 
      this.timestampField = value; 
     } 
    } 

    /// <remarks/> 
    [System.Xml.Serialization.XmlIgnoreAttribute()] 
    public bool TimestampSpecified { 
     get { 
      return this.timestampFieldSpecified; 
     } 
     set { 
      this.timestampFieldSpecified = value; 
     } 
    } 

    /// <remarks/> 
    public string EventType { 
     get { 
      return this.eventTypeField; 
     } 
     set { 
      this.eventTypeField = value; 
     } 
    } 

    /// <remarks/> 
    public string EventDescription { 
     get { 
      return this.eventDescriptionField; 
     } 
     set { 
      this.eventDescriptionField = value; 
     } 
    } 

    /// <remarks/> 
    public string StatusExceptionCode { 
     get { 
      return this.statusExceptionCodeField; 
     } 
     set { 
      this.statusExceptionCodeField = value; 
     } 
    } 

    /// <remarks/> 
    public string StatusExceptionDescription { 
     get { 
      return this.statusExceptionDescriptionField; 
     } 
     set { 
      this.statusExceptionDescriptionField = value; 
     } 
    } 

    /// <remarks/> 
    public Address Address { 
     get { 
      return this.addressField; 
     } 
     set { 
      this.addressField = value; 
     } 
    } 

    /// <remarks/> 
    public string StationId { 
     get { 
      return this.stationIdField; 
     } 
     set { 
      this.stationIdField = value; 
     } 
    } 

    /// <remarks/> 
    public ArrivalLocationType ArrivalLocation { 
     get { 
      return this.arrivalLocationField; 
     } 
     set { 
      this.arrivalLocationField = value; 
     } 
    } 

    /// <remarks/> 
    [System.Xml.Serialization.XmlIgnoreAttribute()] 
    public bool ArrivalLocationSpecified { 
     get { 
      return this.arrivalLocationFieldSpecified; 
     } 
     set { 
      this.arrivalLocationFieldSpecified = value; 
     } 
    } 
} 

И это, как я пытаюсь вызвать преобразование:

TrackEvent currMax = new TrackEvent(); 
currMax.Timestamp = DateTime.MinValue; 
foreach (TrackEvent trackevent in trackDetail.Events) 
{ 
if (trackevent.TimestampSpecified && trackevent.Timestamp > currMax.Timestamp) 
{ 
    currMax = trackevent;     
    var formats = new[] 
    { 
    "MM/dd/yyyy hh:mm tt", 
    "MM/dd/yyyy hh:mmtt", 
    "MM/dd/yyyy h:mm tt", 
    "MM/dd/yyyy h:mmtt", 
    "MM/dd/yyyy hhtt", 
    "MM/dd/yyyy htt", 
    "MM/dd/yyyy h tt", 
    "MM/dd/yyyy hh tt", 
    "MM/dd/yyyy HH:mm:ss.fff", 
    "MM/dd/yyyy h:mm:ss tt" 
    }; 
    DateTime time = DateTime.ParseExact(currMax.Timestamp.ToString(), formats, System.Globalization.CultureInfo.InvariantCulture, 
    System.Globalization.DateTimeStyles.AssumeUniversal |  System.Globalization.DateTimeStyles.AdjustToUniversal); 
    Console.WriteLine(time); 
    } 
} 

ответ

2

Вы используете DateTime.ParseExact, который будет просматривать все ваши данные форматов для разбора string в DateTime.

Но входной datetime формат

1/10/2017 1:13:00 PM 

оказывает только один цифру за его месяц (то есть M/dd ...) в то время как все ваши formats разобрать вход datetime с DateTime.ParseExact поддерживают только два цифры для дня/месяца (то есть: MM/dd ...):

var formats = new[] 
    { 
    "MM/dd/yyyy hh:mm tt", 
    "MM/dd/yyyy hh:mmtt", 
    "MM/dd/yyyy h:mm tt", 
    "MM/dd/yyyy h:mmtt", 
    "MM/dd/yyyy hhtt", 
    "MM/dd/yyyy htt", 
    "MM/dd/yyyy h tt", 
    "MM/dd/yyyy hh tt", 
    "MM/dd/yyyy HH:mm:ss.fff", 
    "MM/dd/yyyy h:mm:ss tt" 
    }; 

Обратите внимание, что вы используете MM/dd ... во всех вас форматах

Чтобы исправить это, вы должны также включать в себя формат в formats, которые позволяют одной цифры как день/месяц представления:

var formats = new[] 
    { 
    "M/d/yyyy hh:mm tt", 
    "M/d/yyyy hh:mmtt", 
    "M/d/yyyy h:mm tt", 
    "M/d/yyyy h:mmtt", 
    "M/d/yyyy hhtt", 
    "M/d/yyyy htt", 
    "M/d/yyyy h tt", 
    "M/d/yyyy hh tt", 
    "M/d/yyyy HH:mm:ss.fff", 
    "M/d/yyyy h:mm:ss tt" 
    }; 

форматы выше будет поддерживать как одну цифру и двухместные цифры день и месяц

Смежные вопросы