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

Posted

技术标签:

【中文标题】如何创建不在当前文化中的 DateTime 对象【英文标题】:How to create a DateTime object not in the current culture 【发布时间】:2010-07-29 18:57:27 【问题描述】:

我真的在这个上画了一个空白。我一直致力于全球化,但 DateTime 似乎总是回归到 CurrentThread 的文化。我把它分解成更小的步骤,希望能找到我的问题,但它开始让我发疯。

我有一个以字符串形式表示日期的文本框:

        // the CurrentThread's culture is de-DE
        // My test browser is also set to de-DE
        IFormatProvider culture = new System.Globalization.CultureInfo("de-DE", 
               true);

        // en-US culture, what I'd ultimately like to see the DateTime in
        IFormatProvider us_culture = new System.Globalization.CultureInfo("en-US", 
               true);

        // correctly reads the textbox value (22.7.2010 into a datetime)
        DateTime dt= DateTime.Parse(txtStartDate.Text, culture, 
                System.Globalization.DateTimeStyles.NoCurrentDateDefault);

        // correctly produces a string 7/22/2010
        string dt2 = dt.ToString(us_culture);

此时我想要一个位于 en-US 的 DateTime 我都试过了:

        DateTime dt3 = Convert.ToDateTime(dt2, us_culture); 
        DateTime dt3 = DateTime.Parse(dt2, us_culture);

但两者都产生 de-DE DateTimes。我提出这个问题的动机是其余的业务逻辑将调用 dt2.toString() 并将导致不正确的日期时间字符串。我意识到我可以将 toString() 更改为 toString(us_culture) 但我宁愿不更改所有其余的业务逻辑来适应这种变化。

有没有办法在 CurrentThread 的文化之外的文化中获取 DateTime?

感谢您的宝贵时间,我已经为此苦苦挣扎了太久了。

【问题讨论】:

我不完全理解。你想要一个不同的 DateTime 值,还是字符串返回不正确(如果我只是很密集,请道歉)。无论文化如何,DateTime 都是 DateTime。唯一会改变的是字符串表示。 【参考方案1】:

DateTime 对象就是这样 - 一个日期/时间,它与文化无关。如果这是您所追求的,则需要使用特定文化来格式化日期。

【讨论】:

感谢您的回复。你是对的,我认为我的问题本身有些混乱。我正在尝试修复 toString() 调用的格式,所以我真的需要更多地考虑我的问题。 我的荣幸。如果您使用的是 .Net 3.0+,您可以按照 DateTime.toAmericanString() 的行创建一个“扩展方法”,以防止您在代码中乱扔格式字符串。【参考方案2】:

ToString() 的参数less 重载将始终根据CurrentCulture 设置输出日期。这就是你想要的 100 的 99 倍。

如果您不想使用重载,可以手动将 CurrentThread.CurrentCulture 设置为您想要的。

System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");

但请理解,这将改变您应用程序中的所有内容。

【讨论】:

"...对于您应用程序中该线程中的所有内容..." 是的,我想得越多,我就越意识到我的问题很困惑。你是对的,我想我只需要修改我所有的 toString() 调用。也许我可以在业务逻辑部分之前设置 CurrentCulture,然后在返回时恢复它?我想知道如果我走那条路,我是否会陷入痛苦的世界,但我可能会尝试一下。感谢您的意见。【参考方案3】:

尝试使用自定义数据格式:

string dt2 = dt.ToString("m/d/yyyy");

【讨论】:

以上是关于如何创建不在当前文化中的 DateTime 对象的主要内容,如果未能解决你的问题,请参考以下文章

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

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

DateTime.TryParseExact 不在 out 参数中返回值?

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

DateTime.Now 和文化/时区特定

在DateTime中,仅使用64位中的62位。负值不在规范中。我如何表示BC的日期?