如何在不同的系统文化中转换 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 ADateTime
在公历中总是。由于您尝试使用 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?的主要内容,如果未能解决你的问题,请参考以下文章
C# - 如何在不改变 DateTime 格式的情况下改变文化
.NET 4.5 DateTime 格式/转换错误与上索布文化
为啥不管文化如何,C# DateTime 解析“01/05/2020”都是一样的?