我想在表中以数字形式存储日期。我知道该怎么做,但我不知道该怎么回去。如何将长变量强制转换为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。我不介意用哪种技术。我只想有一种可以来回转换的方式。
从DateTime:开始
long DateTime.Ticks
到日期从长开始的时间:
new DateTime(long)
从长到日期时间:new DateTime(long ticks)
从DateTime到long:DateTime.Ticks
使用对long t = now.Ticks
和DateTime Today = new DateTime(t)
由于您使用的是ToFileTime
,因此您希望使用FromFileTime来实现另一种方式。但请注意:
通常,FromFileTime方法恢复以前的DateTime值通过ToFileTime方法保存。但是,这两个值可能不同在以下条件下:
如果DateTime值的序列化和反序列化发生在不同的时区。对于例如,如果具有美国东部时间下午12:30时区被序列化,然后在美国太平洋时间反序列化区域,下午12:30的原始值。调整为上午9:30以反映两个时间之间的差异区域。
如果序列化的DateTime值表示无效时间在本地时区。在这种情况下,ToFileTime方法调整恢复了DateTime值,以便表示本地的有效时间时区。
如果您不关心存储了DateTime的哪种long
表示,则可以按照其他人的建议使用Ticks
(Ticks可能更可取,具体取决于您的要求,因为ToFileTime
返回的值似乎在Windows文件系统API的上下文中)。
有几种可能性(请注意,这些长值与Unix epoch.不同
对于您的示例(要反转ToFileTime()
),只需使用DateTime.FromFileTime(t)
。
有一个DateTime构造函数需要很长的时间。
DateTime today = new DateTime(t); // where t represents long format of dateTime
long dateTime = DateTime.Now.Ticks;
Console.WriteLine(dateTime);
Console.WriteLine(new DateTime(dateTime));
Console.ReadKey();
如果您想使用1970年以来的秒数而不是Ticks:
UTC:
long secondsSince1970 = DateTimeOffset.Now.ToUnixTimeSeconds();
当地时间:
long secondsSince1970 = DateTime.Now.Ticks / 10000000 - 62135596800;
回到DateTime
DateTime value = DateTime.MinValue.AddSeconds(secondsSince1970).AddYears(1969);
我将添加一些从字符串到DateTime到长的额外转换
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);