【问题标题】:CultureInfo on DateTime.ParseExact?DateTime.ParseExact 上的 CultureInfo?
【发布时间】:2013-02-17 21:16:28
【问题描述】:

我不明白为什么 DateTime.ParseExact 中的 IFormatProvider 会过载?

如果我准确地定义它应该如何解析(空格、分隔符等),那么应该没有问题:

所有这 3 个例子都显示了相同的结果:

示例 1

CultureInfo provider =CultureInfo.CreateSpecificCulture("en-US");
var t=  DateTime.ParseExact("13-2-2013", "d-M-yyyy", provider, DateTimeStyles.None);  
Console.WriteLine (t); //13/02/2013 00:00:00

示例 2

  CultureInfo provider =CultureInfo.CreateSpecificCulture("en-US");
  var t=    DateTime.ParseExact("13/2/2013", "d/M/yyyy", provider, DateTimeStyles.None);  
  Console.WriteLine (t); //13/02/2013 00:00:00

示例 3

 CultureInfo provider =CultureInfo.CreateSpecificCulture("en-US");
var t=  DateTime.ParseExact("13@@@2@@@2013", "d@@@M@@@yyyy", provider, DateTimeStyles.None);  
 Console.WriteLine (t); //13/02/2013 00:00:00

如果我明确定义结构,为什么我需要提供提供者?

【问题讨论】:

    标签: c# .net datetime


    【解决方案1】:

    仍有一些取决于文化的格式说明符,例如时间分隔符 (:) 和日期分隔符 (/)。那些不匹配特定字符,而是文化中指定的分隔符。

    【讨论】:

    • 但我指定的是那些分隔符! (示例:@@@)
    • @Royi,不是真的。您必须将 / 字符括在单引号中才能实现这一点。您的第二个示例当前使用您的文化的日期分隔符解析日期。
    • @RoyiNamir:如果您使用-,那么这是一个文字字符,但如果您使用/,那么它是日期分隔符说明符,根据文化不同,这是不同的字符。例如,使用瑞典文具,日期分隔符是- 字符。
    • Guffa ,但是我会写d-M-yyyy。我不明白
    • @Guffa 你说 如果你确切地知道会发生什么, 但我难道不应该确切地知道吗?我的意思是,如果您构建一个网页并放置一个带有 datepicker 的文本框,您会告诉 datepicker 对整个世界使用 mm/dd/yyyy 格式吗?因为如果是这样,您将确切地知道要解析什么。但是如果您不告诉 datepicker 格式怎么办?然后用户可以输入他自己的格式。现在我们有一个问题......(或者你的回答是基于我应该检查 userAgent 文化然后做new CultureInfo(GetFromUserAgent())......谢谢Guffa。
    【解决方案2】:

    因为:

    1. 指定的格式可以包括工作日和月份的本地化名称。
    2. 格式字符串中的字符:/ 不表示文字 字符,而是表示格式提供程序指定的分隔符(参见表底部here)。

    【讨论】:

    • 所以对于我的例子是纯日期 - 它不需要......对吗?
    • @RoyiNamir:不,正斜杠也代表特定于文化的分隔符。您需要 '/' 来指定文字斜线。
    • 你能提供会破坏我的样本的例子吗?
    • @RoyiNamir:将文化从 en-US 更改为 de 并尝试示例 #2;它打破了。在示例 #1 中执行相同操作,它仍然有效。那是因为/ 被特殊对待而- 没有。
    • @RoyiNamir:不。每当您在格式字符串中使用/: 时,输入字符串需要在这些位置具有格式提供程序的相应分隔符。如果格式提供程序使用/: 作为分隔符(如en-US),那么这并不明显。但是对于像de 文化这样的提供者,只要您以格式指定/,就需要在输入中使用-
    【解决方案3】:

    我主要可以想象一个 Web 应用程序,也可能是一个表单,客户端向服务器提交信息。此表单还包含一个日期选择器,并根据特定的文化发送选定的日期。因此,如果在美国使用的网站,他们会发送 13/2/2013,而从德国您会收到 13.2.2013。那么如何处理服务器端代码中的日期呢?

    你可以在 ASP.NET MVC 中使用这样的东西(感谢 Sergey,Get CultureInfo from current visitor and setting resources based on that?):

    var userLanguages = Request.UserLanguages;
    CultureInfo ci;
    if (userLanguages.Count > 0)
    {
        try
        {
            ci = new CultureInfo(userlanguages[0]);
        }
        catch(CultureNotFoundException)
        {
             ci = CultureInfo.InvariantCulture;
        }
    }
    else
    {
        ci = CultureInfo.InvariantCulture;
    }
    

    然后解析到日期时间:

    var t = DateTime.ParseExact(formDateString, "d/M/yyyy", ci, DateTimeStyles.None);  
    

    【讨论】:

    • 如果用户输入 2/13/2013 怎么办?我必须将模式从 "d/M/yyyy" 更改为 M/d/yyyy 这就是我的问题。**是否准确解析仅适用于我确切知道 M||d||yyyy 位置的情况?**
    • 不,因为您没有创建一个简单的文本框,而是一个日期选择器,用户可以在其中以交互方式选择日期,并且控件会根据用户的文化显示所选日期。然后单击按钮向服务器发出请求,将日期作为简单字符串发送。是的,在 ParseExact 中你应该明确地告诉格式,插入 Parse,这是一种将字符串转换为日期时间的更灵活的方法。
    • 但是如果日期选择器总是显示 / (因为我在 JS 中告诉过它)?为什么我需要声明一种文化?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 2021-11-16
    • 1970-01-01
    相关资源
    最近更新 更多