将 DateTime 字符串转换为字符串

Convert the DateTime string to string

提问人:Vivek Nuna 提问时间:6/2/2023 最后编辑:Vivek Nuna 更新时间:6/4/2023 访问量:139

问:

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

下面是我的代码。

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

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

foreach (JProperty defaultValueToken in defaultValuesToken)
{
    if (defaultValueToken.Value.Type == JTokenType.Date)
    {
        var value = defaultValueToken.Value.ToString(Newtonsoft.Json.Formatting.None));
    }
    else
    {
        var value = defaultValueToken.Value.ToString());
    }
}
C# .NET 日期时间 .net-core json.net

评论

1赞 Rand Random 6/2/2023
ToString(CutltureInfo.InvariantCutlure);或任何所需的格式 |dotnetfiddle.net/zaoGCuToString("dd-MM-yyyy")
0赞 Vivek Nuna 6/2/2023
我想在很多地方这样做,那么是否有任何全局设置只能在一个地方这样做?
0赞 Rand Random 6/2/2023
你为什么要自己转换 dataTime json.net 原生支持 datetime,所以不要转换为字符串,而是向它传递一个 datetime 并让库处理它
0赞 Vivek Nuna 6/2/2023
ToString(CutltureInfo.InvariantCutlure)给出错误无法从“System.Globalization.CultureInfo”转换为“Newtonsoft.Json.Formatting”
0赞 Vivek Nuna 6/2/2023
@RandRandom它是遗留代码,我想在这里进行最小的更改。value 在其他地方被用作字符串

答:

0赞 MPelletier 6/2/2023 #1

您可以像这样设置当前线程的区域性:

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

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

评论

0赞 Ralf 6/2/2023
如果线程除了从 json 转换之外还做其他事情,这可能是一个危险的建议。
0赞 JonasH 6/2/2023 #2

对于像 DateTime 这样的类型来说,通常同时具有 ToString 和 Parse 方法,这些方法采用可以为其分配区域性的 a。请注意,DateTime 值本身与区域性无关,仅与字符串表示形式相关。但是,当 UI 中显示时,日期时间可以隐式转换为字符串,然后将使用系统区域性。IFormatProvider

Json 应始终使用固定区域性。通常,你的 json 解析器应该会为你处理这个问题。如果要手动将值写入 json 文件,则应确保始终使用 .对于转换为字符串的所有值,而不仅仅是 datetime,都应该如此。.ToString(CultureInfo.InvariantCulture)

如果有一些格式不正确的无效 json,则可以设置 JsonSerializer.Culture 属性。或者只是在分析值时设置正确的区域性。

我不建议仅为了读取/写入 json 而更改 UI 程序中的全局 CurrentCulture,因为这会影响整个程序的格式,这很可能会影响可用性。

1赞 Krishna Varma 6/2/2023 #3

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

public class DateTimeConverter : JsonConverter
{
    private const string DateFormat = "yyyy-MM-ddTHH:mm:ss.fffZ";

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(DateTime) || objectType == typeof(DateTime?);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.Value == null)
        {
            return null;
        }

        if (DateTime.TryParseExact(reader.Value.ToString(), DateFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out var result))
        {
            return result;
        }

        return null;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        if (value is DateTime dateTime)
        {
            writer.WriteValue(dateTime.ToString(DateFormat));
        }
    }
}

使用 JsonConvert 注册 DateTimeConverter

JsonConvert.DefaultSettings = () => new JsonSerializerSettings
{
    Converters = new List<JsonConverter> { new DateTimeConverter() }
};

评论

0赞 Vivek Nuna 6/4/2023
我已经试过了。但这也没有区别
0赞 Krishna Varma 6/4/2023
更新了帖子。 试试这个
0赞 Vivek Nuna 6/5/2023
这也行不通
0赞 Said Belakbir 6/2/2023 #4

将 DateTime 转换为字符串

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

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