【问题标题】:DateTime parsing not working in Windows 7: The string was not recognized as a valid DateTimeDateTime 解析在 Windows 7 中不起作用:该字符串未被识别为有效的 DateTime
【发布时间】:2015-02-23 06:14:32
【问题描述】:

在我开始解释之前,我需要告诉我我已经尝试了 stackoverflow 中提供的所有可能的解决方案。但在 Windows 7 中不起作用。

在 Windows 7 上解析日期时间不起作用。 我试过下面的代码sn-ps

DateTime.ParseExact(arr[TransactionDateIndex], "M/dd/yyyy h:mm:ss tt", null);
DateTime.ParseExact(arr[TransactionDateIndex], "M/d/yyyy h:mm:ss tt",CultureInfo.InvariantCulture);
DateTime.Parse(DateTime.Parse(arr[TransactionDateIndex]).ToString("M/d/yyyy h:mm:ss tt"),CultureInfo.InvariantCulture);  

我有一个输入文件,它有一个交易日期列,它可以是任何有效的日期时间格式,现在在文件中它的 (MM/dd/YYYY) 我需要转换为“M/d/ yyyy h:mm:ss tt" 格式。
在 XP 中运行时,此代码运行良好,但在 Windows 7 中,即使在尝试 ParseExact 后也会显示错误。
即使我使用

if (DateTime.TryParse(input, out dateTime))  
{
}

在 Windows 7 中运行时,很少有记录会被视为无效,但在 XP 中会解析相同的内容。

【问题讨论】:

  • 在日期时间解析中,您提供要解析的格式,而不是要解析的格式。
  • 没有看到失败的输入数据,这里我无话可说。
  • 但是“yyyy-MM-dd”也可以。

标签: c# datetime windows-7 datetime-parsing


【解决方案1】:

如果你当前的日期时间格式是MM/dd/yyyy 那么你应该使用 as

   string dateString = "02/15/2015"
   DateTime dateValue = DateTime.ParseExact(dateString , "MM/dd/yyyy", CultureInfo.InvariantCulture);

如果您想将其转换为您提到的其他格式M/d/yyyy h:mm:ss tt,那么您可以将.Tostring('M/d/yyyy h:mm:ss tt') 添加到日期。

再次阅读您的问题时,您提到它可以采用任何有效的日期时间格式,如果是这样并且您的cultureInfo 是固定的。

您可以使用类似以下的内容,但请注意,可能不止一种格式可以解析相同的日期。例如 10/11/12 可以解析为 yyyy/MM/ddMM/dd/yyyy,它们都是有效的美国日期格式。 MM/dd/yyyy 更常见,所以它出现在列表的第一位,并且是下面代码返回的那个(如果您将它与美国文化而不是示例中的文化一起使用)。

 string testValue = "02/15/2015";

 DateTime result; 
 CultureInfo ci = CultureInfo.GetCultureInfo("sl-SI"); 
 string[] fmts = ci.DateTimeFormat.GetAllDateTimePatterns();
 Console.WriteLine(String.Join("\r\n", fmts)); 
 if (DateTime.TryParseExact(testValue, fmts, ci,    DateTimeStyles.AssumeLocal, out result)) { 
      Console.WriteLine(result.ToLongDateString());   
 }

如果CultureInfo 也不固定,那么您应该获取所有可用的反文化,然后从中获取所有格式,然后解析日期时间。

【讨论】:

  • 我什至尝试过先用有效的日期时间解析字符串,比如 "MM/dd/yyyy" 和 'Datetime.ParseExact',然后将其转换为 "M /dd/yyyy h:mm:ss tt" 但在解析 12/21/2013 或 02-12-2013 或 2/13/2013(有效格式)等值时会发生相同的错误。其他情况对于像 02/12/2013 这样的值,即使在 Windows 7 中,代码也可以正常工作。我真的无法理解我哪里出错了。
  • 12/21/2013 这种情况下,它应该转换为日期。但是在这个02-12-2013 or 2/13/2013 中,您解析的确切格式和日期格式不匹配,这就是为什么如果您的文化是固定的,那么您应该尝试下面的代码来解析所有可用的格式。首先只做解析检查是否所有日期都被正确解析,然后将它们转换为您需要的格式。
  • 不好意思打扰了。再问一下为什么它在 xp 中完美运行。即使使用此代码 ' DateTime.Parse(DateTime.Parse(arr[TransactionDateIndex]).ToString("M/d/yyyy h:mm:ss tt"),null); ' 或者这个 'DateTime.Parse(DateTime.Parse(arr[TransactionDate]).ToString("M/d/yyyy h:mm:ss tt")); ' 代码。即使解析的精确格式和日期格式不匹配,它实际上在 xp 中运行,即 12/21/2013,02/12/2013,2/12/2013 所有这些值也会在没有 parse.exact 的情况下被解析。
  • 不应该的。尝试在 XP 上调试并找出为什么这会起作用,如果不是,然后提出不同的问题与细节。我没有任何细节你的代码发生了什么,所以我不能给你明确的答案。
  • 非常感谢您的帮助。
【解决方案2】:

可能是

中的日期无效
arr[TransactionDateIndex]

所以首先尝试使用硬编码的日期。然后您可以使用 debug.write() (windows app) 或 trance.write() (asp.net) 使用 System.Diagnostics 中的调试类检查传递给 date.parse 的所有值,并检查输出窗口中是否存在任何不一致的日期格式。

最后你可以把这段代码放在出现这段代码的方法的顶部:

System.Threading.Thread.CurrentCulture = CultureInfo.InvariantCulture;

【讨论】:

  • 应该是评论。如果您告诉他进行调试。
猜你喜欢
  • 2022-06-16
  • 1970-01-01
  • 2011-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-04
  • 1970-01-01
相关资源
最近更新 更多