.net 将DateTime字符串转换为字符串

krcsximq  于 2023-06-07  发布在  .NET
关注(0)|答案(4)|浏览(670)

我有一个JToken defaultValuesToken,它在C#代码中有许多JProperty属性。Date类型的一个属性。我正在运行一个foreach循环,并使用ToString方法将属性值转换为字符串。这段代码的问题是,ToString()方法提供了转换后的字符串,按照我的windows系统区域格式,不同的日期格式。给定日期为2023-01- 30 T15:30:59.000753Z。但当区域格式为英语(美国)时,它给出值“1/30/2023 3:30:59 PM”,当区域格式为英语(德国)时,它给出值“30/01/2023 15:30:59”。
下面是我的代码。

  1. foreach (JProperty defaultValueToken in defaultValuesToken)
  2. {
  3. var value = defaultValueToken.Value.ToString();
  4. }

我可以通过添加一个日期类型的检查使用下面的代码来解决这个问题,但我需要在许多地方这样做,所以如果有更好的方法来解决这个问题?是否有一个全局设置,以便我只需要在一个地方进行更改,并且它应该在整个应用程序中工作?

  1. foreach (JProperty defaultValueToken in defaultValuesToken)
  2. {
  3. if (defaultValueToken.Value.Type == JTokenType.Date)
  4. {
  5. var value = defaultValueToken.Value.ToString(Newtonsoft.Json.Formatting.None));
  6. }
  7. else
  8. {
  9. var value = defaultValueToken.Value.ToString());
  10. }
  11. }
dwthyt8l

dwthyt8l1#

下面是一个如何为序列化和反序列化设置全局日期格式的示例:

  1. public class DateTimeConverter : JsonConverter
  2. {
  3. private const string DateFormat = "yyyy-MM-ddTHH:mm:ss.fffZ";
  4. public override bool CanConvert(Type objectType)
  5. {
  6. return objectType == typeof(DateTime) || objectType == typeof(DateTime?);
  7. }
  8. public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
  9. {
  10. if (reader.Value == null)
  11. {
  12. return null;
  13. }
  14. if (DateTime.TryParseExact(reader.Value.ToString(), DateFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out var result))
  15. {
  16. return result;
  17. }
  18. return null;
  19. }
  20. public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
  21. {
  22. if (value is DateTime dateTime)
  23. {
  24. writer.WriteValue(dateTime.ToString(DateFormat));
  25. }
  26. }
  27. }

使用JsonConvert注册DateTimeConverter

  1. JsonConvert.DefaultSettings = () => new JsonSerializerSettings
  2. {
  3. Converters = new List<JsonConverter> { new DateTimeConverter() }
  4. };
展开查看全部
svgewumm

svgewumm2#

您可以设置当前线程的区域性,如下所示:

  1. Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture;
  2. Thread.CurrentThread.CurrentUICulture = System.Globalization.CultureInfo.InvariantCulture; // for the UI

使用CultureInfo枚举中所需的区域性。

7lrncoxx

7lrncoxx3#

像DateTime这样的类型通常都有ToString和Parse-method,它们接受一个IFormatProvider,您可以将区域性分配给它。请注意,DateTime值本身与区域性无关,仅与字符串表示形式相关。但是当在UI中显示时,可以将日期时间隐式转换为字符串,然后将使用系统区域性。
JSON应该始终使用不变的区域性。通常你的json解析器会帮你处理这个问题。如果你手动将值写入json文件,你应该确保总是使用.ToString(CultureInfo.InvariantCulture)。所有转换为字符串的值都应该是这种情况,而不仅仅是datetime。
如果你有一些格式不正确的无效json,你可以设置一个JsonSerializer.Culture属性。或者只是在分析值时设置正确的区域性。
我不建议仅仅为了阅读json而改变UI程序中的全局CurrentCulture,因为这会影响整个程序的格式,这很可能会影响可用性。

bq8i3lrv

bq8i3lrv4#

将DateTime转换为字符串

  1. DateTime dateTime = DateTime.Now;
  2. string dateTimeString = dateTime.ToString("yyyy-MM-ddTHH:mm:ss.fffZ");

在本例中,我们使用ToString方法,格式字符串为"yyyy-MM-ddTHH:mm:ss.fffZ",表示ISO 8601格式的日期和时间。T说明符用于分隔日期和时间组件,Z说明符表示时间是协调世界时(UTC)。

相关问题