WebAPIのレスポンスでDateTimeを返す時に、ミリ秒を3桁で出力する
json内の日付フォーマットがそのままではSystem.Text.Jsonで解釈されないときのConverterを参考に
DateTimeJsonConverterを作成し、
C#(DateTimeJsonConverter.cs)
public class DateTimeJsonConverter : JsonConverter<DateTime>
{
public override DateTime Read(
ref Utf8JsonReader reader,
Type typeToConvert,
JsonSerializerOptions options)
{
if (reader.GetString() is not { } str) return DateTime.MinValue;
if (DateTime.TryParse(str, out var dateTime)) return dateTime;
throw new JsonException("DateTime Parseエラー");
}
/// <summary>
/// 日時をシリアライズするときにミリ秒は000で出力する
/// </summary>
/// <param name="writer"></param>
/// <param name="dateTimeValue"></param>
/// <param name="options"></param>
public override void Write(
Utf8JsonWriter writer,
DateTime dateTimeValue,
JsonSerializerOptions options) =>
writer.WriteStringValue(dateTimeValue.ToString(
"yyyy-MM-ddTHH:mm:ss.fff", CultureInfo.InvariantCulture));
}
jun maedaさんにコメント頂きReadを編集しました
- if (reader.GetString()! == null) return DateTime.MinValue;
- try
- {
- var dateTime = DateTime.Parse(reader.GetString()!);
- return dateTime;
- }catch
- {
- throw new JsonException("DateTIme Parseエラー");
- }
+ if (reader.GetString() is not { } str) return DateTime.MinValue;
+ if (DateTime.TryParse(str, out var dateTime)) return dateTime;
+ throw new JsonException("DateTime Parseエラー");
public class Hoge
{
[JsonConverter(typeof(DateTimeJsonConverter))]
public DateTime created_at { get; set; }
}
Hogeに適応してみたところ
var obj = JsonSerializer.Deserialize<Hoge>(json);
とやったところミリ秒が3桁で出力されることが確認できました。
ですが、WebAPIの戻り値で確認したところ、DateTimeJsonConverterが適応されずミリ秒の3桁が出力されません。
そこで
C#(Program.cs)
builder.Services.AddControllers().AddJsonOptions(options =>
options.JsonSerializerOptions.Converters.Add(new DateTimeJsonConverter()));
でDateTimeJsonConverterを登録したところWebAPIでも適用されました。