0

我的 DB2 数据库中有一个字符串,它位于美国。我有一个列值设置为此字符串“2011-12-31 00:00:00”,它表示 2011 年、12 月和 12 月的第一天。

我在我的客户端程序中将其作为字符串检索,该程序在英国运行,并且 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);
4

3 回答 3

2

我强烈建议您提前知道格式,使用TryParseExact而不是TryParse

bool success = DateTime.TryParseExact(quarterStarter, "yyyy-MM-dd HH:mm:ss",
                                      CultureInfo.InvariantCulture,
                                      DateTimeStyles.None,
                                      out quarterStart);

请注意,您应该检查返回值TryParseExact以检查它是否被正确解析 - 如果您对异常没有问题,只需使用它ParseExact

您现有的代码完全有可能工作得很好——毕竟,你已经提供了不变的文化——但是指定格式可以让你更清楚你真正的期望,也意味着你会检测出一个意外格式的值提供。

于 2013-02-07T18:17:55.440 回答
1

您可以使用ParseExact拉日期,例如:

var s = "2011-12-01 00:00:00";
var dt = DateTime.ParseExact(s,"yyyy-MM-dd HH:mm:ss",CultureInfo.InvariantCulture);
于 2013-02-07T18:18:19.517 回答
1

您可以设置不随文化变化的特定格式。

DateTime dt;
DateTime.TryParseExact(dateTime, 
                       "yyyy-MM-dd hh:mm tt", 
                       CultureInfo.InvariantCulture, 
                       DateTimeStyles.None, 
                       out dt);
于 2013-02-07T18:18:29.770 回答