如何在不同的系统文化中转换 DateTime?

Posted

技术标签:

【中文标题】如何在不同的系统文化中转换 DateTime?【英文标题】:How to convert DateTime in different System culture? 【发布时间】:2016-02-01 09:00:17 【问题描述】:

我需要将DateTime 值转换为不同的文化格式,无论系统中设置什么。

没有选择任何特定的时区进行转换,任何文化格式都在使用转换 DateTime 值。

DateTimeFormatInfo ukDtfi = new CultureInfo(CultureInfo.CurrentCulture.ToString(), false).DateTimeFormat;
StartingDate = Convert.ToDateTime(System.Web.HttpContext.Current.Session["StartDate"].ToString(), ukDtfi);

我正在使用上面的代码,但它不能正常工作。 目前我在我的系统中设置了ar-SA文化。

【问题讨论】:

无法正常工作是什么意思?您已经使用Convert.ToDateTime(System.Web.HttpContext.Current.Session["StartDate"].ToString(), ukDtfi) 进行解析。为什么要生成它的字符串表示,然后再解析成DateTime “将 DateTime 转换为不同的文化”是什么意思? DateTime 没有文化。您的问题目前非常不清楚 - 我们不知道您期望实现什么或您当前的代码会发生什么。理想情况下,提供一个简短但完整的程序来演示问题,使用硬编码数据,包括预期输出和实际输出。 顺便问一下,你的System.Web.HttpContext.Current.Session["StartDate"].ToString()返回的是什么? 返回“31/1/2016 12:00 AM” 【参考方案1】:

让我先弄清楚一些主题..

DateTime 实例没有任何时区信息和文化设置。它只是有日期和时间值。文化设置概念在您获得文本(字符串)表示时适用。

由于您使用ar-SA 文化,您的字符串格式不是那种文化的标准日期和时间格式。

var dt = DateTime.Parse("31/1/2016 12:00 AM", CultureInfo.GetCultureInfo("ar-SA"));
// Throws FormatException

而您不能使用ar-SA 文化解析此字符串,因为此文化使用ص 作为AMDesignator,因为它使用UmAlQuraCalendar 而不是GregorianCalendar

您可以使用InvariantCulture(它使用AM 作为AMDesignator 并使用GregorianCalendar)代替DateTime.ParseExact 方法并准确指定其格式。

string s = "31/1/2016 12:00 AM";
DateTime dt = DateTime.ParseExact(s, "dd/M/yyyy hh:mm tt", 
                                  CultureInfo.InvariantCulture);

在你的情况下;

StartingDate = DateTime.ParseExact(System.Web.HttpContext.Current.Session["StartDate"].ToString(), 
                                   "dd/M/yyyy hh:mm tt", 
                                   CultureInfo.InvariantCulture);

【讨论】:

它没有给我任何异常,但是它给出了错误的返回值“21/4/1437 12:00:00 ص”。我从 Control 中选择了这个“31/1/2016 12:00 AM”值。 @JeetBhatt A DateTime 在公历中总是。由于您尝试使用 ar-SA 文化中定义的 UmAlQuraCalendar 进行解析,因此此 ParseExact 方法将其操作为 that 日历值。你可以在islamicfinder.org/… 链接上看到它。公历中的 31/1/2016 等于 UmAlQura 日历中的 21/4/1437【参考方案2】:

试着用这个来解决你的问题:

string myTime = DateTime.Parse("01/02/2016")
                        .ToString(CultureInfo.GetCultureInfo("en-GB").DateTimeFormat.ShortDatePattern);

【讨论】:

它给出了同样的错误,“字符串无法识别有效的日期时间”。我在我的开发系统中设置了“ar-SA”文化,然后尝试转换为“en-US”文化 你能给我那个 DLL 的名字吗? 在我这边,一切正常。您需要添加以下内容: using System.Globalization; @JeetBhatt

以上是关于如何在不同的系统文化中转换 DateTime?的主要内容,如果未能解决你的问题,请参考以下文章

如何创建不在当前文化中的 DateTime 对象

C# - 如何在不改变 DateTime 格式的情况下改变文化

.NET 4.5 DateTime 格式/转换错误与上索布文化

为啥不管文化如何,C# DateTime 解析“01/05/2020”都是一样的?

MVC 控制器接收从 CurrentThread.CurrentCulture 解析为不同文化的 DateTime

DateTime.Now 和文化/时区特定