将日期时间转换为长整型,以及反过来

65

我想在表格中将日期存储为数字。我知道如何做到这一点,但是我不知道如何还原。如何将一个 long 变量强制转换为 ToDateTime。

DateTime now = DateTime.Now;
long t = now.ToFileTime();
DateTime today = t.ToDateTime;  // I am looking for something like this line. This Method does not exist

我知道有很多将DateTime转换为long的方法,我不介意使用哪种技术。我只想要一种可以相互转换的方法。


12
@DourHighArch:我不同意。这个问题表述得很明确,意图也很清楚。“有一个DateTime,如何可逆地将其转换为long?” 这个问题值得回答。我曾经恰好有这个问题,并且在这里得到了答案,感谢原帖的作者。没有什么比回答“你为什么要那样做?数据库可以存储日期和时间。”更让人沮丧的了。于是问题无解。 - Laurent LA RIZZA
9个回答

128

也许是 DateTime.Now.Ticks? - Darth Jon
@Darth:它不是静态属性,而是实例。 - abatishchev
2
@tgarcia,一毫秒内有10,000,000个时钟周期。 - Alexander
1
@Alexander,没错,一毫秒内有10,000个时钟周期。谢谢!我会删除错误的评论以避免任何混淆。 - tgarcia
这里是将ticks转换为有用时间的方法:https://msdn.microsoft.com/zh-cn/library/system.timespan.tickspermillisecond(v=vs.110).aspx - Alexander
将 datetime.ToString("yyyyMMddHHmmss") 转换为 long? - Kiquenet

15

从长整型到日期时间: new DateTime(long ticks)

从日期时间到长整型: DateTime.Ticks


11

5

由于您正在使用 ToFileTime,因此您需要使用 FromFileTime 来实现相反的效果。但是请注意 注意

通常,FromFileTime 方法会还原通过 ToFileTime 方法保存的 DateTime 值。但是,在以下情况下,这两个值可能不同:

如果 DateTime 值的序列化和反序列化发生在不同的时区。例如,如果具有美国东部时间区域中下午 12:30 的时间的 DateTime 值被序列化,然后在美国太平洋时间区域中进行反序列化,则原始值下午 12:30 将调整为上午 9:30,以反映两个时区之间的差异。

如果序列化的 DateTime 值在本地时区表示无效时间。在这种情况下,ToFileTime 方法将调整还原的 DateTime 值,使其在本地时区表示有效时间。

如果你不关心DateTime的哪个long表示被存储,你可以像其他人建议的那样使用Ticks(根据你的要求,Ticks可能更可取,因为ToFileTime返回的值似乎是在Windows文件系统API的上下文中)。

3

有几种可能性(注意这些长数值不同于Unix时间戳)。

对于您的示例(反向ToFileTime()),只需使用DateTime.FromFileTime(t)即可。


1
   long dateTime = DateTime.Now.Ticks;
   Console.WriteLine(dateTime);
   Console.WriteLine(new DateTime(dateTime));
   Console.ReadKey();

1

有一个接受长整型参数的DateTime构造函数。

DateTime today = new DateTime(t); // where t represents long format of dateTime 

1
如果您想使用1970年以来的秒数而不是Ticks:
UTC:
long secondsSince1970 = DateTimeOffset.Now.ToUnixTimeSeconds();

当地时间:

long secondsSince1970 = DateTime.Now.Ticks / 10000000 - 62135596800;

回到日期时间

DateTime value = DateTime.MinValue.AddSeconds(secondsSince1970).AddYears(1969);

0

我将添加一些额外的字符串转换为 DateTime 到 long 的转换

string timeString = "2016-08-04";
DateTime date = DateTime.Parse(timeString);
long dateTime = date.Ticks;

这里是缩写的说法:

long dateTime = DateTime.Parse("2016-08-04").Ticks;

//And for the long to DateTime

DateTime date = new DateTime(dateTime);

这并没有回答问题。请重新查看问题。 - Enigmativity
@Enigmativity 这个编辑够了吗? - Zahari Kitanov
那肯定涵盖了问题中的关键点。我有两个批评意见,一是你没有充分的理由引入解析 - OP并没有询问解析 - 二是你并没有提供比现有答案更具有说服力的新信息。 - Enigmativity
谢谢您的反馈,那只是我现在正在处理的一些额外事情,并想分享我的额外经验。我会尽量保持未来回答的重点。 - Zahari Kitanov
1
然后说明您为什么添加它。给它一些背景,解释为什么您认为这是一个有价值的补充。 - Enigmativity

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接