提问人:Vivek Nuna 提问时间:6/2/2023 最后编辑:Vivek Nuna 更新时间:6/4/2023 访问量:139
将 DateTime 字符串转换为字符串
Convert the DateTime string to string
问:
我有一个 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”。ToString
ToString()
下面是我的代码。
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());
}
}
答:
您可以像这样设置当前线程的区域性:
Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture;
Thread.CurrentThread.CurrentUICulture = System.Globalization.CultureInfo.InvariantCulture; // for the UI
使用 CultureInfo 枚举中所需的区域性。
评论
对于像 DateTime 这样的类型来说,通常同时具有 ToString 和 Parse 方法,这些方法采用可以为其分配区域性的 a。请注意,DateTime 值本身与区域性无关,仅与字符串表示形式相关。但是,当 UI 中显示时,日期时间可以隐式转换为字符串,然后将使用系统区域性。IFormatProvider
Json 应始终使用固定区域性。通常,你的 json 解析器应该会为你处理这个问题。如果要手动将值写入 json 文件,则应确保始终使用 .对于转换为字符串的所有值,而不仅仅是 datetime,都应该如此。.ToString(CultureInfo.InvariantCulture)
如果有一些格式不正确的无效 json,则可以设置 JsonSerializer.Culture 属性。或者只是在分析值时设置正确的区域性。
我不建议仅为了读取/写入 json 而更改 UI 程序中的全局 CurrentCulture,因为这会影响整个程序的格式,这很可能会影响可用性。
下面是如何为序列化和反序列化设置全局日期格式的示例:
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() }
};
评论
将 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"
T
Z
评论
ToString(CutltureInfo.InvariantCutlure);
或任何所需的格式 |dotnetfiddle.net/zaoGCuToString("dd-MM-yyyy")
ToString(CutltureInfo.InvariantCutlure)
给出错误无法从“System.Globalization.CultureInfo”转换为“Newtonsoft.Json.Formatting”