根据c#中的文化转换(更改)当前日期时间

Posted

技术标签:

【中文标题】根据c#中的文化转换(更改)当前日期时间【英文标题】:Convert(change) current DateTime as per culture in c# 【发布时间】:2015-11-02 21:19:38 【问题描述】:
if (!IsPostBack && !Page.IsCallback)

    double OffsetHrs = GetTimeZoneOffsetFromCookie();
    string dateFormat = ServiceManager.LocalizationService.GetString("AppHeaderTop", "DateFormat", "g");
    CultureSelected CultureSelected = GetCultureSelected();
    ASPxLabelCurrentTime.Text = DateTime.Now.ToUniversalTime().AddHours(-OffsetHrs).ToString(dateFormat);                
if (CultureSelected.CultureCode != "en-US") 

    DateTimeFormatInfo usDtfi = new CultureInfo("en-US", false).DateTimeFormat;
    DateTimeFormatInfo currentDtfi = new CultureInfo(CultureSelected.CultureCode, false).DateTimeFormat;
    ASPxLabelCurrentTime.Text = Convert.ToDateTime(ASPxLabelCurrentTime.Text, usDtfi).ToString(currentDtfi.ShortDatePattern); //what can i Use here ?
               

假设ASPxLabelCurrentTime.Text 的输出 对于en-US,文化是11/2/2015 4:14 PM (70) 如果我选择特定文化,我希望此日期时间 11/2/2015 4:14 PM (70) 以该特定文化格式显示。

【问题讨论】:

避免使用Convert.ToDateTime,改用DateTime.ParseExact 如果我使用 DateTime.ParseExact 如何代表不同文化的“格式”。使用不同文化的语法是什么?? @virtualreality 这取决于字符串和区域性设置。例如,文化必须是 PM 在它的 PMDesignator 属性中。 【参考方案1】:

您的问题似乎不清楚,但我尝试试一试。

首先,(70) 到底是什么?这是从哪里来的? en-USculture 不能解析这个字符串,而不用ParseExactTryParseExact 方法在字符串文字分隔符中使用它。另一方面,由于您将 ASPxLabelCurrentTime.Text 设置为 DateTime.Now.ToUniversalTime().AddHours(-OffsetHrs).ToString(dateFormat) 代码的结果,我不相信 (70) 这部分真的是这个问题的问题。

其次,如果我理解清楚,问题似乎是DateTime.ToString(string)方法的使用。

ASPxLabelCurrentTime.Text = Convert.ToDateTime(ASPxLabelCurrentTime.Text, usDtfi)
                                   .ToString(currentDtfi.ShortDatePattern);
                                    // ^^^ Problem seems here

好吧,假设您使用usDtfi 文化(即en-US)成功解析了此ASPxLabelCurrentTime.Text但是使用此.ToString(string) 方法,您实际上并没有使用currentDtfi 设置,当您生成DateTime 的格式化字符串表示时,您正在使用CurrentCulture 设置。

来自DateTime.ToString(String) doc;

将当前 DateTime 对象的值转换为其等效值 使用指定格式和格式的字符串表示 当前文化的惯例

由于我们不知道 GetCultureSelected 方法究竟返回什么,它可能可能不currentDtfi 的文化相同。

强烈怀疑,您可以通过使用 that 文化作为ToString 方法中的第二个参数作为解决此问题;

ASPxLabelCurrentTime.Text = Convert.ToDateTime(ASPxLabelCurrentTime.Text, usDtfi)
                                   .ToString(currentDtfi.ShortDatePattern, currentDtfi);

如果这个(70) 确实是您字符串的一部分,您需要使用ParseExactTryParseExact 方法来提供它的确切格式。

string s = "11/2/2015 4:14 PM (70)";
DateTime dt;
if(DateTime.TryParseExact(s, "MM/d/yyyy h:mm tt '(70)'", CultureInfo.GetCultureInfo("en-US"),
                          DateTimeStyles.None, out dt))

    ASPxLabelCurrentTime.Text = dt.ToString(currentDtfi.ShortDatePattern, currentDtfi);

【讨论】:

是的。正如你所说的问题在于 ASPxLabelCurrentTime.Text = Convert.ToDateTime(ASPxLabelCurrentTime.Text, usDtfi) .ToString(currentDtfi.ShortDatePattern); // ^^^ 问题似乎在这里..................................当我使用它时,它正在转换2015 年 11 月 3 日上午 9:14 至 2015 年 3 月 11 日。时间没有显示出来......而且我们不必担心(70)。 @virtualreality 因为您使用的是ShortDatePatternCurrentCulture,这是 显示日期部分。你想要什么结果在你的ASPxLabelCurrentTime.Text 上? @virtualreality 那么你需要使用自定义格式为dd/MM/yyyy HH:mm 而不是ShortDatePattern 之类的; Convert.ToDateTime(ASPxLabelCurrentTime.Text, usDtfi).ToString("dd'/'MM'/'yyyy HH':'mm") 我在这里使用文化代码是因为我拥有不止一种文化,例如“en-US”、en-GB、it-IT、tr-TR 等等。是否有任何其他格式或日期模式可以处理任何文化日期时间格式。 if (CultureSelected.CultureCode != "en-US") DateTime datetimenow = DateTime.Parse(DateTime.Now.ToUniversalTime().AddHours(-iOffsetHours).ToString(dateFormat)); ASPxLabelCurrentTime.Text = datetimenow.ToString(new CultureInfo(CultureSelected.CultureCode));我尝试了上面的代码,它根据文化而变化,但我也得到了几秒钟的时间..对于“en-GB”这样的 03/11/2015 10:27:00 和“pt-PT”03-11-2015 10:29:00.. 怎样才能摆脱秒杀?如果没有,还有其他方法吗?

以上是关于根据c#中的文化转换(更改)当前日期时间的主要内容,如果未能解决你的问题,请参考以下文章

将任何日期字符串转换为当前文化日期格式

如何修改 Blazor(服务器)中的当前文化日期格式?

从服务器获取当前日期时间并将其转换为 c# 中的本地时间

Oracle 根据浏览器文化返回日期时间格式

根据文化显示正确的日期格式

无论文化信息如何,C# 解析为日期时间