【问题标题】:Deploy c# application but on beta testing crashes because of date format部署 c# 应用程序,但由于日期格式而在 beta 测试中崩溃
【发布时间】:2025-11-22 07:55:02
【问题描述】:

我想知道是否有人有在全球范围内部署应用程序的经验以及他们如何处理应用程序中的日期格式?

例如,我在英国,日期格式为 DD/MM/YYYY,但我的应用程序在美国客户中崩溃,因为日期格式为 MM/DD/YYYY

日期以文本形式保存到配置文件中,并在应用程序中调用和使用。但是,英国、欧洲和澳大利亚的客户没有任何问题,而美国和加拿大的客户则有。

我假设 .Net 会处理日期,我使用 DateTime.Parse(strDateFromFile) 并且它崩溃了。即"12/31/2010" 失败但"31/12/2010" 没问题。

在 .Net 中我可以做些什么来确保正确解析本地日期格式。

我已尝试将字符串转换为已知格式并再次转换回来,但似乎也是一个问题:

     static public string DateToString(DateTime dtDate)
    {
        string strDay = dtDate.Day.ToString();
        string strMonth = String.Format("{0:MMMM}", dtDate).ToString();
        string strYear = dtDate.Year.ToString();
        string strDate = string.Format("{0}-{1}-{2}", strDay, strMonth, strYear);

        return strDate;
    }

    static public DateTime StringToDate(string strDate)
    {
        DateTime dtDate = new DateTime();

        try
        {
            dtDate = DateTime.Parse(strDate);
        }
        catch (Exception ex)
        {
            Logger.Log.Error(MethodBase.GetCurrentMethod().ToString(), ex);
            System.Windows.Forms.MessageBox.Show(string.Format("DEBUG INFO:  Date Format: {0}\r\n{1}", strDate, ex.Message));
        }
    }

由于我在整个申请过程中都使用了日期,因此我们将不胜感激地接受有关如何处理申请中日期的任何建议。

谢谢

【问题讨论】:

    标签: c# .net datetime deployment datetime-format


    【解决方案1】:

    执行 DateTime.Parse 时需要传入当前文化:

    DateTime dt = DateTime.Parse("1/1/2000", Thread.CurrentThread.CurrentUICulture);

    至于为当前线程设置文化,我不确定这是根据用户的设置自动发生还是默认为开发期间使用的文化。

    还请注意,对于数字和日期时间(可能还有其他)的 ToString 调用,您将需要使用相同的技巧。如果它成为一个大问题,您可能会考虑使用 ReSharper,它会警告使用特定于文化的 ToStrings。

    【讨论】:

      【解决方案2】:

      如果您接受用户输入,则不会尝试设置文化信息,您只需要知道他们输入内容时会发生什么。换句话说,你需要知道他们的文化信息是什么,并相应地处理它。

      System.Globalization 命名空间提供了您完成此任务所需的大部分内容。例如,如果我的应用在我自己的机器上运行时执行此操作(我在美国):

      DateTimeFormatInfo dtfi = CultureInfo.CurrentCulture.DateTimeFormat;
      string dateTimeFormatPattern = dtfi.FullDateTimePattern;
      

      我得到这个字符串:

      dddd, MMMM dd, yyyy h:mm:ss tt

      或者使用 ShortDatePattern:

      CultureInfo.CurrentCulture.ShortDatePattern = M/d/yyyy
      

      您可以使用这些信息来了解用户的期望,并相应地对其进行解析。

      检查这个问题/答案:

      http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/cb19f31c-6d30-4cd9-8644-80ce3ecde52f/

      但我认为@Eric_Andres 的答案可能更接近您正在寻找的内容......

      【讨论】:

        【解决方案3】:

        我有在不同国家(加拿大、美国)使用的设置文件,但随后它们会被检索到我的系统(我在澳大利亚)以找出一些东西。当您查看(2011 年 1 月 10 日)是 10 月 1 日或 1 月 10 日时,事情开始变得非常奇怪。这取决于它的来源,所以我在我的设置文件中远离了人类可读的日期。相反,我使用了DateTime.Now.ToBinary 并以这种方式存储很长,无论我在哪里加载它,它总是会正确显示。

        对于日志记录,我总是选择我喜欢的格式并在我的格式化中使用它。

        yyyyMMdd HH:mm:ss.ffff 这样您就不会受到任何区域设置等的摆布。日志记录确实是为了让您能够追踪问题,所以我真的不在乎客户是否正在尝试阅读它。

        如果您还与远程系统协调其他系统,请考虑使用 UTC 而不是本地时间来记录您的信息。

        【讨论】:

        • 您有一个如何将二进制转换为格式化数字的示例,即 yyyyMMdd HH:mm:ss.ffff。我可以尝试转换 DateTime.FromBinary 但在转换过程中仍然有问题。
        • theDate.ToString("yyyyMMdd HH:mm:ss.ffff")
        【解决方案4】:

        如果您需要配置或日志或发送的任何文件,请选择一种日期格式并为其创建手动解析器。 Splitstring,通过Substring()int.Parse()他们读取数字...

        【讨论】:

          最近更新 更多