转换.NET时间戳

时间:2015-07-26 15:56:53

标签: datetime autohotkey

任何人都知道这是什么时间戳? 130580051014610352

我相信它自1970年以来就是一种常见的东西,在.NET中很常见。

我需要将它转换为AutoHotkey中的YYYYMMDDHH24MISS时间戳。

感谢任何帮助

2 个答案:

答案 0 :(得分:1)

它似乎是Windows file time。引用MSDN:

  

文件时间是一个64位值,表示自上午12点以来经过的100纳秒间隔的数量。 1601年1月1日协调世界时(UTC)。

但是,请记住,获取此时间戳的文件系统很重要。

  • NTFS根据UTC时间正确存储文件时间。

  • FAT16和FAT32根据本地时间存储文件时间。

    • 如果(例如)将文件保存到一台计算机上的拇指驱动器上,然后从另一台计算机上的另一台计算机加载它,则可能会出现此问题。
    • 在单个时区内也可能存在问题,因为本地时间无法消除夏令时间后退过渡期间的值之间的歧义。

假设该值来自NTFS且因此基于UTC,您可以使用DateTime.FromFileTimeUtc在.NET代码中获取UTC时间,或者您可以使用DateTime.FromFileTime获得等效的本地时间。

我不确定AutoHotkey脚本语言中的等效代码究竟是什么,但我确实注意到它已经有built-in function来从文件中获取时间戳,如果是#39; s你正在做什么。

答案 1 :(得分:0)

有人在 AHK 论坛上发布了一个解决方案:

TicksToTime(FileTicks,UTC="")
{ ; 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601 (UTC)
    ; FileTicks := 131817689607677716
    FileSeconds := FileTicks // 10000000
    DateTimeUTC := 1601
    DateTimeUTC += FileSeconds, S
    if (UTC = 1)
        Return DateTimeUTC
    ; LocalTicks := FileTimeToLocalFileTime(FileTicks) ;;;
    VarSetCapacity(FileTime, 8, 0)
    VarSetCapacity(LocalTime, 8, 0)
    NumPut(FileTicks, FileTime, "UInt64")
    DllCall("FileTimeToLocalFileTime", "Ptr", &FileTime, "Ptr", &LocalTime)
    FileSeconds := (NumGet(LocalTime, "UInt64") // 10000000)
    DateTimeLoc := 1601
    DateTimeLoc += FileSeconds, S
    ;utc time = DateTimeUTC
    Return DateTimeLoc
}