c#中系统时间格式与数据库返回时间字符串值格式冲突

本文关键字:时间 格式 字符串 冲突 返回 系统 数据库 | 更新日期: 2023-09-27 18:08:54

我使用DateTime.ParseExact将我的日期字符串值转换为日期对象。

下面是我用来将日期字符串转换为DateTime对象的代码。

DateTime.ParseExact(“ my date string value from database ”, "dd/MM/yyyy HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture) ;

我的数据库返回像“25/9/2016 00:00:00”这样的字符串值。但是当我调试我的代码时,它不断地给我字符串不是有效的字符串转换为DateTime对象。

我必须改变我的笔记本电脑日期时间格式为 " d/M/yyyy H:mm:ss " 使我的数据库字符串值为有效的字符串值。

那么我如何保证我的代码在服务器上工作。这种情况的解决方案是什么?我是否必须检查服务器日期时间格式,并根据它更改格式字符串之前构建我的代码。

c#中系统时间格式与数据库返回时间字符串值格式冲突

ParseExact,格式为"dd/MM/yyyy HH: MM:ss",当您给它字符串" 25/9/2016 00:00:00 "时将失败,因为月份只是一个单位数。

将格式改为"dd/M/yyyy HH:mm:ss"是正确的解决方案。

然而,你不应该存储日期&时间在你的数据库中作为字符串,你会不断遇到这种问题。其中一个主要原因是发生日期到字符串转换时的不同设置。主要的是日-月-年vs月-日-年,以及日和月的一位数vs两位数。此外,如果您正在转换为本地时间而不是UTC,那么如果您有不同时区的用户,事件将在数据库中无序显示。

如果你真的需要字符串,那么你可以使用ParseExact的重载,它接受一个允许的格式数组,这样你就可以处理多种格式,就像那页的例子:

  string[] formats= {"M/d/yyyy h:mm:ss tt", "M/d/yyyy h:mm tt", 
                     "MM/dd/yyyy hh:mm:ss", "M/d/yyyy h:mm:ss", 
                     "M/d/yyyy hh:mm tt", "M/d/yyyy hh tt", 
                     "M/d/yyyy h:mm", "M/d/yyyy h:mm", 
                     "MM/dd/yyyy hh:mm", "M/dd/yyyy hh:mm",
                     "MM/d/yyyy HH:mm:ss.ffffff" };
  string[] dateStrings = {"5/1/2009 6:32 PM", "05/01/2009 6:32:05 PM", 
                          "5/1/2009 6:32:00", "05/01/2009 06:32", 
                          "05/01/2009 06:32:00 PM", "05/01/2009 06:32:00",
                          "08/28/2015 16:17:39.125", "08/28/2015 16:17:39.125000" };
  DateTime dateValue;
  foreach (string dateString in dateStrings)
  {
     try {
        dateValue = DateTime.ParseExact(dateString, formats, 
                                        new CultureInfo("en-US"), 
                                        DateTimeStyles.None);
        Console.WriteLine("Converted '{0}' to {1}.", dateString, dateValue);
     }
     catch (FormatException) {
        Console.WriteLine("Unable to convert '{0}' to a date.", dateString);
     }                                               
  }