@@ -45,7 +45,7 @@ public static class DateTimeSerializer
4545 private const char XsdTimeSeparator = 'T' ;
4646 private static readonly int XsdTimeSeparatorIndex = XsdDateTimeFormat . IndexOf ( XsdTimeSeparator ) ;
4747 private const string XsdUtcSuffix = "Z" ;
48- private static readonly char [ ] DateTimeSeperators = new [ ] { '-' , '/' } ;
48+ private static readonly char [ ] DateTimeSeparators = { '-' , '/' } ;
4949 private static readonly Regex UtcOffsetInfoRegex = new Regex ( "([+-](?:2[0-3]|[0-1][0-9]):[0-5][0-9])" , PclExport . Instance . RegexOptions ) ;
5050 public static Func < string , Exception , DateTime > OnParseErrorFn { get ; set ; }
5151
@@ -100,7 +100,8 @@ public static DateTime ParseShortestXsdDateTime(string dateTimeStr)
100100 return unspecifiedDate . Prepare ( ) ;
101101 }
102102
103- if ( dateTimeStr . Length == DefaultDateTimeFormatWithFraction . Length )
103+ var hasUtcSuffix = dateTimeStr . EndsWith ( XsdUtcSuffix ) ;
104+ if ( ! hasUtcSuffix && dateTimeStr . Length == DefaultDateTimeFormatWithFraction . Length )
104105 {
105106 var unspecifiedDate = config . AssumeUtc
106107 ? DateTime . Parse ( dateTimeStr , CultureInfo . InvariantCulture , DateTimeStyles . AssumeUniversal )
@@ -109,7 +110,9 @@ public static DateTime ParseShortestXsdDateTime(string dateTimeStr)
109110 return unspecifiedDate . Prepare ( ) ;
110111 }
111112
112- var kind = DateTimeKind . Unspecified ;
113+ var kind = hasUtcSuffix
114+ ? DateTimeKind . Utc
115+ : DateTimeKind . Unspecified ;
113116 switch ( config . DateHandler )
114117 {
115118 case DateHandler . UnixTime :
@@ -135,7 +138,7 @@ public static DateTime ParseShortestXsdDateTime(string dateTimeStr)
135138
136139 if ( dateTimeStr . Length >= XsdDateTimeFormat3F . Length
137140 && dateTimeStr . Length <= XsdDateTimeFormat . Length
138- && dateTimeStr . EndsWith ( XsdUtcSuffix ) )
141+ && hasUtcSuffix )
139142 {
140143 var dateTime = Env . IsMono ? ParseManual ( dateTimeStr ) : null ;
141144 if ( dateTime != null )
@@ -144,7 +147,7 @@ public static DateTime ParseShortestXsdDateTime(string dateTimeStr)
144147 return PclExport . Instance . ParseXsdDateTimeAsUtc ( dateTimeStr ) ;
145148 }
146149
147- if ( dateTimeStr . Length == CondensedDateTimeFormat . Length && dateTimeStr . IndexOfAny ( DateTimeSeperators ) == - 1 )
150+ if ( dateTimeStr . Length == CondensedDateTimeFormat . Length && dateTimeStr . IndexOfAny ( DateTimeSeparators ) == - 1 )
148151 {
149152 return DateTime . ParseExact ( dateTimeStr , "yyyyMMdd" , CultureInfo . InvariantCulture , DateTimeStyles . None ) ;
150153 }
@@ -164,12 +167,14 @@ public static DateTime ParseShortestXsdDateTime(string dateTimeStr)
164167 {
165168 if ( config . SkipDateTimeConversion )
166169 {
167- return DateTime . Parse ( dateTimeStr , null ,
168- kind == DateTimeKind . Unspecified
169- ? DateTimeStyles . None
170- : kind == DateTimeKind . Local
171- ? DateTimeStyles . AssumeLocal
172- : DateTimeStyles . AssumeUniversal ) ;
170+ var dateTimeStyle = kind == DateTimeKind . Unspecified
171+ ? DateTimeStyles . None
172+ : kind == DateTimeKind . Local
173+ ? DateTimeStyles . AssumeLocal
174+ : DateTimeStyles . AssumeUniversal ;
175+ if ( config . AlwaysUseUtc )
176+ dateTimeStyle |= DateTimeStyles . AdjustToUniversal ;
177+ return DateTime . Parse ( dateTimeStr , null , dateTimeStyle ) ;
173178 }
174179
175180 var assumeKind = config . AssumeUtc ? DateTimeStyles . AssumeUniversal : DateTimeStyles . AssumeLocal ;
0 commit comments