将字符串转换为日期并更改年份0001到1900

时间:2013-08-28 20:19:04

标签: c# sql-server datetime

我收到一个包含以下值的字符串:

0001-01-01T12:30:00

保存到数据库时我只需要时间部分。

但我无法将{{1>}年保存在 MSSQL Server (字段为0001类型)中,因为它需要 1900 +

目前我检查年份是什么,并使用以下代码重新创建日期:

SmallDateTime

是否有更简单的方法来使用年份设置为0001的日期格式?

我不知道我导入的所有可能具有此值的字段,我不想为所有字段添加此代码。

3 个答案:

答案 0 :(得分:3)

您可以将DateTime.Add()方法与DateTime.TimeOfDay属性结合使用。

如果这是常规SQL datetime,您可以使用SqlDateTime.MinValue帮助程序,并将DateTime添加到其中。

SqlDateTime.MinValue.Value.Add(Convert.ToDateTime("0001-01-01T12:30:00").TimeOfDay)

对于smalldatetime,您可以创建自己的。

new DateTime(1900, 1, 1).Add(Convert.ToDateTime("0001-01-01T12:30:00").TimeOfDay)

答案 1 :(得分:1)

如果时间部分是你所关心的,那么你所拥有的是最好的事情。由于日历问题,即使SQL Server中的常规DateTime数据类型也只能返回到1753.

如果您想要一个基本上不受约束的日期数据类型,它将接受从0001开始的年份,那么请使用DateTime2

答案 2 :(得分:1)

如果您不关心日期组件,那么您应该这样做:

public static DateTime String2SqlAcceptableDateTimeValue( string iso8601DateTimeValue )
{
  CultureInfo ci = CultureInfo.InvariantCulture ;
  DateTime timestamp ;
  bool converted = DateTime.TryParseExact( iso8601DateTimeValue , "yyyy-MM-ddTHH:mm:ss" , ci ,DateTimeStyles.None, out timestamp ) ;

  if ( !converted ) throw new ArgumentException("Not an ISO 8601 Date/Time value" , "iso8601DateTimeValue");

  DateTime epoch = new DateTime(1900,1,1) ;
  DateTime sqlAcceptableValue = epoch + timestamp.TimeOfDay ;

  return sqlAcceptableValue ;
}

将转换中的日期组件排除到DateTime可能更容易。这使它成为1-liner(井,2线):

CultureInfo ci = CultureInfo.InvariantCulture ;
string tod = "0001-01-01T12:34:56".Substring(11) ;
DateTime dtx = new DateTime(1900,1,1) + DateTime.ParseExact(tod,"HH:mm:ss",ci).TimeOfDay ;

我认为这使得意图更加清晰;