【问题标题】:C Sharp DateTime FormatC Sharp 日期时间格式
【发布时间】:2013-06-04 17:18:56
【问题描述】:

更新 这看起来是 Windows 7 中的一个错误。我在 Windows 8 上测试了相同的场景,但我无法在那里复制它。如果您想了解更多信息,请参阅我在此问题上发布的MS Bug Report。再次感谢所有提供帮助的人。

更新 2 该错误也发生在 Server 2008 R2 上(有点预期)

原始提交

使用下一页上的示例Date Formats 我可以控制我的日期格式。但是,我的一位客户使用 Windows 7 修改了他们的日历以显示他们的短日期,例如“ddd MM/dd/yy”,请参阅图片以了解设置。 .

这会像这样显示时钟。

这很好用,除非我在他们的机器上使用日期。当我像下面这样格式化日期时......

String.Format("{0:MM/dd/yy}", dt); //the result is 06 04 13, notice the spaces

如果我取消 ddd 以在日历设置中显示星期几并使用相同的格式选项,我会看到以下内容...

String.Format("{0:MM/dd/yy}", dt); //the result is 06/04/13, this time it has forward slashes

日期上的 .ToShortDateString() 选项显示“Tue 06/04/13”,并在进入数据库时​​崩溃。这就是问题的发现方式。

除了对格式进行硬编码,即将月份加入正斜杠到当天等之外,有谁知道我还能尝试什么来让它工作?

【问题讨论】:

  • 听起来您正在将日期格式化为字符串,以便通过某些 SQL 将其发送。您是否考虑过为此使用命令参数而不是字符串格式?
  • +1 对迈克尔的评论。除非文本表示是您的最终目标,否则您应该避免字符串转换。
  • 是的,这是一个相当古老的应用程序。它确实有一个刚刚传入的 sql 字符串。我希望避免转换为命令参数并等到我可以将其转换为 EF。这听起来确实是个好主意。我会试试看。
  • @Michael Gunter - 你的建议奏效了。如果您将其发布为答案,我会将其标记为解决方案。

标签: c# date datetime string-formatting


【解决方案1】:

听起来您正在将日期格式化为字符串,以便通过某些 SQL 将其发送。您是否考虑过为此使用命令参数而不是字符串格式?

【讨论】:

    【解决方案2】:

    使用 InvariantCulture 应该可以。我创建了一个测试控制台应用程序来检查它。该代码将线程的当前文化更改为不变文化:

    class Program
    {
        static void Main(string[] args)
        {
                /// Displays '06 04 13'
    
            Console.WriteLine(string.Format("{0:MM/dd/yy}", System.DateTime.Now));
    
            System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture;
    
                /// Displays '06/04/13'
    
            Console.WriteLine(string.Format("{0:MM/dd/yy}", System.DateTime.Now));
    
            Console.ReadLine();
        }
    }
    

    【讨论】:

    • 我对此进行了测试,它有效。我赞成它,因为你回答了我的要求,因为迈克尔的评论最终成为一个更合适的解决方案,我正在等待看看他是否将其发布为答案。我给他直到明天。然后我会把你的标记为答案。
    • 顺便说一句,这看起来完全像微软的错误。即使 Windows 中的短日期格式设置为“ddd MM/dd/yy”,日期也应显示为斜线。我将 WINdows 设置保留为“ddd MM/dd/yyyyy”,因为它在 Windows 任务栏中看起来不错。但我注意到 Outlook 显示的日期不带斜线(与您的问题相同。)也许您应该向 Microsoft 报告。
    • 是的,其他人也提到过。请查看我的答案中的链接,如果您有兴趣关注,我会将其发布到 MS 论坛。
    • 这是一个 .Net 错误,您可以在这里报告:connect.microsoft.com/VisualStudio
    【解决方案3】:

    编辑注释:这看起来是 Windows 7 的一个错误。通过控制面板更改短日期模式时,使用 OP 帖子中的“附加设置”选项卡,两个CurrentCulture 和 CurrentUICulture 的日期分隔符也发生了变化。

    当您修改短日期格式时,看起来第一个非格式字符被拾取为当前文化的日期分隔符。 CurrentCulture 和 CUrrentUiCulture 都进行了修改,以反映 [意外] 自定义。看起来一些 [聪明的] 开发人员做出了 [无根据的] 假设,即没有人会拥有包含星期几之类的短日期格式。

    不错的收获!您要向 Microsoft 报告错误吗?

    如果您使用不变的文化来格式化日期等,用户设置不会影响您。尝试类似

    String.Format( CultureInfo.InvariantCulture , "{0:MM/dd/yy}", dt);
    

    或使用您想要的文化实例:

    CultureInfo usa = CultureInfo.GetCultureINfo("en-US") ;
    string.Format( usa , "{0:MM/dd/yy}" , dt ) ;
    

    但是,如果您指定的文化与为 Windows 操作系统设置的当前文化相匹配,则会应用用户自定义:这意味着,除非您使用不是当前 Windows 文化的文化,否则您将遇到同样的问题。

    MDSN 上的更多详细信息:

    在不指定特定文化的情况下,您将获得当前用户的CurrentCultureCurrentUICulture,并应用任何用户指定的模组。

    【讨论】:

    • 感谢您的评论,不幸的是,文化格式也没有解决问题。我预计这也是解决方案,但我认为 ddd 之后设置中的空间将分隔符踢进了一个空间(有点像在欧洲他们使用 . 作为分隔符)。它确实格式正确,但仍然出现空格。
    • @Gouber80。有趣的。我不得不将其称为 Windows 7 错误。请参阅我修改后的答案。如果您使用 InvariantCulture(刚刚检查),问题不会显现出来。
    • 我同意它应该用 CurrentCulture 修复 - 如果你看到崩溃的答案,他还注意到它没有出现在 InvariantCulture 中。我想我会把它放在 Win 7 论坛上。我已经有一段时间没有发现可能是潜在的 Windows 问题了;)。
    【解决方案4】:

    如果您对这方面的更多信息感兴趣,请转到我在HERE 发布的 MS 论坛帖子。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-19
      • 1970-01-01
      • 1970-01-01
      • 2010-10-21
      • 2011-04-09
      • 1970-01-01
      相关资源
      最近更新 更多