我的DB2数据库中有一个字符串,它位于美国。我有一个列值设置为字符串"2011-12-31 00:00:00",表示2011年、12月和12月1日。
我在我的客户端程序中检索这个字符串,该程序正在英国运行,UI设置为本地区域性(默认)。我的客户项目也在美国和香港运行,文化设置为当地文化,即分别为美国和香港。
我使用以下代码将字符串解析为日期时间。我不太确定这是否会奏效,我也找不到任何好的链接来指引我的方向。你能告诉我这在不同的文化中是否有效吗,如果不是为什么的话?
string quarterStartDate = "2011-12-01 00:00:00";
DateTime quarterStart;
DateTime.TryParse(quarterStartDate, CultureInfo.InvariantCulture, DateTimeStyles.None, out quarterStart);
return quarterStart;
我有一个测试,它可以根据我的要求工作,但我也不太确定当UI在另一个国家运行时,它是否会工作。
string quarterStarter = "2011-12-01 00:00:00";
DateTime quarterStart;
DateTime.TryParse(quarterStarter,CultureInfo.InvariantCulture,DateTimeStyles.None,out quarterStart);
Assert.IsTrue(quarterStart.Year == 2011);
Assert.IsTrue(quarterStart.Month == 12);
Assert.IsTrue(quarterStart.Day == 1);
我强烈建议您提前了解格式,使用TryParseExact
而不是TryParse
:
bool success = DateTime.TryParseExact(quarterStarter, "yyyy-MM-dd HH:mm:ss",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out quarterStart);
请注意,应该检查TryParseExact
的返回值,以检查它是否被正确解析——如果您对异常没有问题,只需使用ParseExact
即可。
您现有的代码完全有可能正常工作——毕竟,您已经提供了不变的区域性——但指定格式可以更清楚地显示您真正期望的内容,也意味着您将检测是否提供了意外格式的值。
您可以使用ParseExact
来提取日期,例如:
var s = "2011-12-01 00:00:00";
var dt = DateTime.ParseExact(s,"yyyy-MM-dd HH:mm:ss",CultureInfo.InvariantCulture);
您可以设置一个不随区域性而更改的特定格式。
DateTime dt;
DateTime.TryParseExact(dateTime,
"yyyy-MM-dd hh:mm tt",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out dt);