C# 在c中将双精度值转换为DateTime#

C# 在c中将双精度值转换为DateTime#,c#,datetime,C#,Datetime,我有一个双重值 例: 无法将此双精度值转换为日期格式,如“10/11/2016” 我试着用 DateTime newDate = DateTime.FromOADate(currentDate); 但这是一个例外 不是法定的约会 OADate是自1899年12月30日起的天数: 因此,当被视为OLE自动化日期时,20161011对应于年份57098(您有一个错误)。要以正确的方式转换您的价值,即转换到2016年10月11日: double currentDate = 20161011;

我有一个双重值
例:

无法将此双精度值转换为日期格式,如“10/11/2016”

我试着用

 DateTime newDate = DateTime.FromOADate(currentDate);
但这是一个例外

不是法定的约会


OADate是自1899年12月30日起的天数:

因此,当被视为OLE自动化日期时,
20161011
对应于年份
57098
(您有一个错误)。要以正确的方式转换您的价值,即转换到2016年10月11日:

double currentDate = 20161011;  
int v = (int) (currentDate + 0.5);

DateTime result = new DateTime(v / 10000, (v / 100) % 100, v % 100);

OLE自动化日期不是这样的,它是一个(大致)指示1900年1月1日之后的日期的系统

如果我必须做那种丑陋的转换,我会这样做:

double currentDate = 20161011;
int intCurrentDate = (int)currentDate;
DateTime newDate = new DateTime(intCurrentDate / 10000, intCurrentDate / 100 % 100, intCurrentDate % 100);

您可以将double转换为字符串,然后调用ParseExact指定格式

DateTime newDate = DateTime.ParseExact(currentDate.ToString(), "yyyyMMdd", null);

但实际上,您应该尽量避免这种情况,并从一开始就将日期存储在DateTime变量中。

为什么您希望
10/11/2016
而不是
11/10/2016
?你认为哪一个是2016年10月11日?首先,谁会存储这样的日期,为什么?我猜那个日期是10月11日,对吧?请记住,并不是每个人都使用相同的格式(mm/dd或dd/mm)。是的,2016年10月11日。当你无法解开自己的约会方法时,你知道你走错了路。我应该避免这种情况,但我从API中获得的日期是双值,我正在转换代码以日期格式显示。为什么
+0.5
?我看不出这样做有什么好处。@Andrew:当
currentDate
类似于
20161010.9999999999 7
(从数据库加载/从API获取、处理等)时,防止出现舍入错误;我多么讨厌那些东西,但我认为那只影响小数。整数不应该有这个问题。无论如何,我不认为(也不希望)“双重约会”来自手术@安德鲁:我来;你说得很对
double currentDate=20161011
没有舍入错误,但是数据的实际来源是可疑的(“但是我从API中获取的日期是一个双倍值”-参见对Steve答案的评论),所以为了安全起见,我添加了+0.5
DateTime newDate = DateTime.ParseExact(currentDate.ToString(), "yyyyMMdd", null);