我有一个不能遵循说明的供应商提供的数据文件。我们需要三个日期字段来填充Start_date,Process_date,Report_date。我们要求格式为mm / dd / yyyy,但是由于他们是从其他国家/地区发送报告,因此我们得到了hodgpog。 dd / mm / yyyy或正确的mm / dd / yyyy。问题出在我同时获得两种格式的同一列中。 有谁知道我如何验证给定值以确定他们使用的是dd / mm / yyyy还是正确的mm / dd / yyyy。假设我正在设置参数stdt =“ givenvalue”。
答案 0 :(得分:2)
恐怕,混合数据会影响供应商。
我建议您需要在三个单独的数据字段中输入数据:日,月,年。
他们应该更容易为他们提供日,月,年,而不是尝试将其日期格式从美国本地日期格式重新格式化为美国格式。
这来自西班牙,多年来,日期/数字格式使我的生活变得“有趣”。
答案 1 :(得分:1)
您可以检查前2位数字是否大于12,格式可能是DD / MM / YYYY,或者第3位或第4位数字组合是否大于12,格式可能是MM / DD / YYYY。但是,只有在日期包含的值大于12的情况下,此条件才适用。因此,使用此方法不会为您提供100%正确的结果。
另一种方法可能是检查语言环境默认值。您可以检查哪个国家/地区使用哪种格式,并根据报告的国家/地区使用该格式解析日期。
或者您可以要求他们仅以特定格式提供日期。
答案 2 :(得分:1)
您不应该要求世界各地的供应商使用任意格式的文本。
不应期望任何供应商执行类似以下的奇怪逻辑:
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; }
}
如果未设置语言代码,则假定ISO 8601格式为YYYYMMDD,并且默认情况下至少有许多国家/地区可以使用:
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);
}
这意味着您仍然可以使用美国格式:
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"),
};
答案 3 :(得分:0)
您可以在报告文件中再增加一列(或值)具有原籍国,然后从中选择正确的格式吗?
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
Latam的结果= 2018/6/15