.net 如何在C#中实现Java持续时间?

ev7lccsx  于 2023-11-20  发布在  .NET
关注(0)|答案(1)|浏览(181)

假设我从Java中得到了一个持续时间:“PT-328 H-46 M-43.2082074S”。如何在system.text.json中将其转换为NodaTime Duration?

nkhmeac6

nkhmeac61#

这是Noda Time通常用于 periods 而不是duration的格式。不幸的是,值中存在多个符号意味着您无法使用DurationPattern解析它-但PeriodPattern.NormalizingIso似乎可以正常工作:

  1. using NodaTime.Text;
  2. var pattern = PeriodPattern.NormalizingIso;
  3. var result = pattern.Parse("PT-328H-46M-43.2082074S");
  4. var period = result.Value;
  5. var duration = period.ToDuration();
  6. Console.WriteLine(duration);

字符串
要在System.Text.Json中使用它,您需要指定正确的周期模式.然后可能从周期到持续时间进行“蹦床”排序。下面是一个完整的示例:
Program.cs:

  1. using NodaTime;
  2. using NodaTime.Serialization.SystemTextJson;
  3. using NodaTime.Text;
  4. using System.Text.Json;
  5. string json = """
  6. {
  7. "name": "Jon",
  8. "duration": "PT-328H-46M-43.2082074S"
  9. }
  10. """;
  11. var settings = new NodaJsonSettings
  12. {
  13. PeriodConverter = new NodaPatternConverter<Period>(PeriodPattern.NormalizingIso)
  14. };
  15. var options = new JsonSerializerOptions().ConfigureForNodaTime(settings);
  16. var model = JsonSerializer.Deserialize<Model>(json, options);
  17. Console.WriteLine(model.Duration);


Model.cs:

  1. using NodaTime;
  2. using System.Text.Json.Serialization;
  3. public class Model
  4. {
  5. [JsonPropertyName("name")]
  6. public string Name { get; set; }
  7. [Obsolete]
  8. [JsonPropertyName("duration")]
  9. public Period Period
  10. {
  11. // TODO: A getter, if you want to be able to serialize back.
  12. // That's a little more work as there isn't a Duration.ToPeriod conversion.
  13. set => Duration = value.ToDuration();
  14. }
  15. [JsonIgnore]
  16. public Duration Duration { get; set; }
  17. }

展开查看全部

相关问题