![](/img/trans.png)
[英]How to change date format from DD/MM/YYYY or MM/DD/YYYY to YYYY-MM-DD?
[英]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.