繁体   English   中英

如何确定日期格式是 dd/mm/yyyy vs mm/dd/yyyy

[英]How to determine if a date format is dd/mm/yyyy vs mm/dd/yyyy

我有一个无法遵循指示的供应商提供的数据文件。 我们有三个日期字段,他们需要填充 Start_date、Process_date、Report_date。 我们要求格式为 mm/dd/yyyy,但是由于他们发送来自不同国家的报告,我们得到一个大杂烩。 dd/mm/yyyy 或正确的 mm/dd/yyyy。 问题出在日期的同一列中,我得到了两种格式。 有谁知道我如何验证给定值以确定他们使用的是 dd/mm/yyyy 还是正确的 mm/dd/yyyy。 假设我正在设置一个参数 stdt = "givenvalue"。

恐怕,对于混合数据,您将受到供应商的摆布。

我的建议是您需要三个单独的数据字段中的数据:日、月、年。

他们应该更容易为您提供日、月、年,而不是试图将其本地日期格式重新格式化为美国格式。

这来自西班牙,多年来,日期/数字格式让我的生活变得“有趣”。

您可以检查前 2 位数字是否大于 12,格式可能是 DD/MM/YYYY,或者如果组合的第 3 位或第 4 位数字大于 12,则格式可能是 MM/DD/YYYY。 但是这个条件只适用于日期包含的值 > 12。所以,使用这种方法不会给你 100% 正确的结果。

另一种方法可能是检查语言环境默认值。 您可以根据报告国家/地区/地区检查哪个国家/地区使用哪种格式并使用该格式解析日期。

或者您可能只是要求他们仅提供特定格式的日期。

您不应该要求世界各地的供应商使用某种任意格式的文本。

不应该期望任何供应商做奇怪的逻辑,比如:

var today = DateTime.Now;
message.ReportDate = $"{today.Month}/{today.Day}/{today.Year}";

在他们的代码中,它很容易出错,而且很奇怪。 是的,任何开发人员都可以做同样的事情,但更漂亮......但为了说明,我会留下它。

相反,更好的选择是允许本地文化信息(也许作为附加字段)

public class Report
{
   public string Name {get; set;}
   public string ReportDate { get; set; }
   public string ISOLanguageCode { get; set; }
}

如果未设置语言代码,则假定 YYYYMMDD 的 ISO 8601 格式,并且默认情况下至少有很多国家/地区可以使用:

Console.WriteLine(DateTime.Parse("2020.07.20"));
Console.WriteLine(DateTime.Parse("2020-07-20"));
Console.WriteLine(DateTime.Parse("2020/07/20"));

但是当指定 ISO 语言代码时:您可以使用任何格式:

DateTime dt;
if (!IsNullOrEmpty(report.ISOLanguageCode))
{
  System.Globalization.CultureInfo cultureinfo =
  System.Globalization.CultureInfo("report.ISOLanguageCode");
  dt = DateTime.Parse(report.ReportDate, cultureinfo);
}
else
{
   dt = DateTime.Parse(report.ReportDate);
}

这意味着对于 en-US 格式,您仍然可以这样做:

var report = new Report()
{
   Name = "July report 20",
   Date = "07/20/2020",
   ISOLanguageCode = "en-US"
};

每件事都应该更加稳定。

并假设您的数据层需要当前格式以供后代使用:只需根据需要将其添加到 BL/DL 中:

dbContext.Add(new Report()
{
   //... Most the other properties
   ReportDate = report.ToString("dd/MM/yyyy"),
};

您能否在报告文件中再添加一列(或值)具有原产国并从中选择正确的格式?

            string userDate = "6/15/2018", newDate; //fill date from your report
            DateTime result;
            CultureInfo provider = CultureInfo.InvariantCulture;

            if (country.Text == "USA")
            {
                try
                {
                     
                    DateTime.TryParse(userDate,provider, DateTimeStyles.None,out result);
                    newDate = result.ToString("MM/dd/yyyy");
                }
                catch (Exception)
                {
                    //some code
                }
            }
            else // example for LatinAmerica
            {
                provider = new CultureInfo("es-MX"); //LatinAmerica uses day/month
                try
                {
                    DateTime.TryParse(userDate, provider, DateTimeStyles.None, out result); // This converts it to your expected format.
                    newDate = result.ToString("MM/dd/yyyy");
                }
                catch (Exception)
                {
                    //some code
                }
            }      

美国的结果 = 2018 年 6 月 15 日

拉丁美洲的结果 = 2018 年 6 月 15 日

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM