Skip to content

Commit cc4315e

Browse files
committed
Added support of nine digit nanoseconds format where last two digits are cut off.
1 parent e64c372 commit cc4315e

File tree

1 file changed

+27
-4
lines changed

1 file changed

+27
-4
lines changed

src/KubernetesClient.Models/KubernetesJson.cs

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)