3

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

例如,我在英国,日期格式是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));
        }
    }

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

谢谢

4

4 回答 4

3

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

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

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

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

于 2012-07-17T22:41:59.597 回答
1

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

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 的答案可能更接近您正在寻找的内容......

于 2012-07-17T22:54:16.240 回答
1

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

对于 Logging,我总是选择一种我喜欢的格式,并在我的 Formatting 中使用它。

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

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

于 2012-07-17T23:08:23.027 回答
0

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

于 2012-07-17T23:00:53.947 回答