如何解决在 C# 中将语言设置为阿拉伯语时,Google 日历事件的读取和转换日期问题
我正在使用 Google APIs .net 客户端库来读取日历事件。
我有以下代码行
newRow["Start"] = pEventItem.Start.DateTime.HasValue ?
Convert.ToDateTime(pEventItem.Start.DateTime) : Convert.ToDateTime(pEventItem.Start.Date);
其中 PEventItem 的类型为 Google.Apis.Calendar.v3.Data.Event,而 NewRow[...] 的类型为 DataRow。 pEventItem.Start.Date 的值为“2019-06-24”(在调试窗口中看到)
以上代码行完美运行,但失败,当 UI 语言/文化设置为阿拉伯语(沙特阿拉伯)时,相同的 Convert.ToDateTime 抛出错误“字符串未被识别为有效的日期时间”。
顺便说一句,我如何更改 UI 语言如下供您参考。
Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.GetCultureInfo(ChangeLanguageTo);
Thread.CurrentThread.CurrentUICulture = System.Globalization.CultureInfo.GetCultureInfo(ChangeLanguageTo);
我尝试设置 Convert.ToDateTime 函数的第二个参数,希望它能正确转换日期...
CultureInfo enUsCulture = new CultureInfo("en-us");
newRow["Start"] = pEventItem.Start.DateTime.HasValue ? Convert.ToDateTime(pEventItem.Start.DateTime,enUsCulture) : Convert.ToDateTime(pEventItem.Start.Date,enUsCulture);
现在不抛出异常,但是返回的日期不正确。返回值是 {21/10/40 12:00:00 õ}
而实际日期 pEventItem.Start.Date 是“2019-06-24”
我也尝试了不变文化,但结果是一样的,转换日期是错误的。可能是什么问题?
问候
解决方法
这里发生了一些事情。
首先,如果你使用 EventDateTime.DateTime
(例如通过 pEventItem.Start.DateTime
)你不需要调用 Convert.ToDateTime
,因为那已经是一个 DateTime?
...你可以使用 Value
属性从 DateTime
获取 DateTime?
。但是,我应该警告说,它可以执行您可能不想要的时区转换。 (我们无法修复库以避免这些,因为这将是一个破坏性更改。)相反,您可能想要解析 EventDateTime.DateTimeRaw
,它是 API 返回的原始字符串值。
解析时,我建议使用 CultureInfo.InvariantCulture
使用不变区域性(而不是创建 en-US 区域性),并使用 DateTime.ParseExact
进行解析,根据您是否需要指定您期望的格式重新解析日期或完整的日期/时间。
就“返回的日期不正确”而言 - 我相信这实际上只是使用默认文化的格式化值,包括日历系统。我们可以在下面的代码中看到这一点,它直接构造了 DateTime
(因此不会受到任何文本解析等的影响)。使用固定区域性格式化时,它显示为 2019-06-24,但使用 ar-SA 格式化时,由于该区域性的默认日历系统为 System.Globalization.UmAlQuraCalendar
,因此显示为“1440-10-21”:
// Note: when a calendar system is not specified,// it's implicitly Gregorian.
DateTime date = new DateTime(2019,6,24);
Console.WriteLine(date.ToString("yyyy-MM-dd",CultureInfo.InvariantCulture));
Console.WriteLine(date.ToString("yyyy-MM-dd",new CultureInfo("ar-SA")));
所以您在调试器中看到的是正确的日期 - 但以您意想不到的方式格式化。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。