@@ -26,18 +26,41 @@ public override void Write(Utf8JsonWriter writer, TimeSpan value, JsonSerializer
2626
2727 private sealed class KubernetesDateTimeOffsetConverter : JsonConverter < DateTimeOffset >
2828 {
29- private const string SerializeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.ffffffK" ;
30- private const string Iso8601Format = "yyyy'-'MM'-'dd'T'HH':'mm':'ssK" ;
29+ private const string RFC3339NanoFormat = "yyyy-MM-dd'T'HH':'mm':'ss.fffffffK" ;
30+
31+ private static string FormatDateTimeOffsetToSevenDigitsNanoseconds ( string dateTime )
32+ {
33+ var isUTC = dateTime . EndsWith ( "Z" ) ;
34+ var dateTimeWithoutZ = isUTC ? dateTime . Substring ( 0 , dateTime . Length - 1 ) : dateTime ;
35+
36+ var nanoSecondsDelimiterIndex = dateTimeWithoutZ . LastIndexOf ( "." , StringComparison . Ordinal ) ;
37+ var withoutNanoseconds = nanoSecondsDelimiterIndex > - 1 ? dateTimeWithoutZ . Substring ( 0 , nanoSecondsDelimiterIndex ) : dateTimeWithoutZ ;
38+
39+ var sevenDigitNanoseconds = "0000000" ;
40+ if ( nanoSecondsDelimiterIndex > - 1 )
41+ {
42+ var nanoSecondsAsString = dateTimeWithoutZ . Substring ( nanoSecondsDelimiterIndex + 1 ) ;
43+ var leadingZeroes = nanoSecondsAsString . TakeWhile ( c => c == '0' ) . Count ( ) ;
44+ var nanoSecondsWithoutLeadingZeroesAsString = nanoSecondsAsString . Substring ( leadingZeroes ) ;
45+ sevenDigitNanoseconds = nanoSecondsAsString . Length > 7
46+ ? nanoSecondsAsString . Substring ( 0 , 7 )
47+ : new string ( '0' , leadingZeroes )
48+ + ( int . Parse ( nanoSecondsWithoutLeadingZeroesAsString )
49+ * ( int ) Math . Pow ( 10 , 7 - leadingZeroes - nanoSecondsWithoutLeadingZeroesAsString . Length ) ) ;
50+ }
51+
52+ return withoutNanoseconds + "." + sevenDigitNanoseconds + ( isUTC ? "Z" : "" ) ;
53+ }
3154
3255 public override DateTimeOffset Read ( ref Utf8JsonReader reader , Type typeToConvert , JsonSerializerOptions options )
3356 {
3457 var str = reader . GetString ( ) ;
35- return DateTimeOffset . ParseExact ( str , new [ ] { Iso8601Format , SerializeFormat } , CultureInfo . InvariantCulture , DateTimeStyles . None ) ;
58+ return DateTimeOffset . ParseExact ( FormatDateTimeOffsetToSevenDigitsNanoseconds ( str ) , new [ ] { RFC3339NanoFormat } , CultureInfo . InvariantCulture , DateTimeStyles . None ) ;
3659 }
3760
3861 public override void Write ( Utf8JsonWriter writer , DateTimeOffset value , JsonSerializerOptions options )
3962 {
40- writer . WriteStringValue ( value . ToString ( SerializeFormat ) ) ;
63+ writer . WriteStringValue ( value . ToString ( RFC3339NanoFormat ) ) ;
4164 }
4265 }
4366
0 commit comments