DateTime ToFileTime和ToFileTimeUtc具有相同的输出

Aar*_*ron 5 c# datetime

我打开一个文件,并使用ToUniversalTime()ToLocalTime()输出不同的时间.但是,当我使用ToFileTime()和时ToFileTimeUtc(),我得到相同的数字.为什么是这样?

DateTime creationTime = File.GetCreationTime(@"c:\windows\setupact.log");
Console.WriteLine("utc time: " + creationTime.ToUniversalTime());
Console.WriteLine("file time: " + creationTime.ToLocalTime());
Console.WriteLine("file: " + creationTime.ToFileTime());
Console.WriteLine("utc: " + creationTime.ToFileTimeUtc());
Run Code Online (Sandbox Code Playgroud)

产量

时间:2013年8月22日下午2:46:17

提交时间:2013年8月22日上午7:46:17

file:130216563774628355

utc:130216563774628355

不应该文件和utc是不同的?

mkl*_*nt0 6

现有答案中有很好的信息,但让我尝试一个务实的总结:

System.DateTime.ToFileTime()和之间的唯一区别System.DateTime.ToFileTimeUtc()是实例的.Kind属性等于 时Unspecified,即,如果不清楚时间值是表示本地时间还是UTC时间
这些信息实际上是汉斯·帕桑特( Hans Passant)自己删除的回答。

换句话说:对于属性等于or(唯一的其他可能值)并且行为相同的System.DateTime实例- 这就是 OP 所经历的,因为他的输入值是(由 返回的类型)。.KindLocalUtcSystem.DateTime.ToFileTime()System.DateTime.ToFileTimeUtc().Kind LocalFile.GetCreationTime()

需要注意的是相关System.DateTimeOffset类型的设计总是带有明确的UTC偏移信息,因此从来不确定性,这可能是为什么该类型有只有一个.ToFileTime()方法(而不是同时.ToFileTimeUtc())。

正如其他人指出,返回始终代表UTC时间

  • 根据定义,文件时间值总是表示UTC中的时间点。

  • 因此,无论是.ToFileTime().ToFileTimeUtc()创造表现为自午夜1601年1月1日UTC时间间隔为100ns的计数时间点。

要对一个地方补充OP自己的例子.ToFileTime().ToFileTimeUtc() 的结果不同:

// Create a DateTime instance with .Kind equal to Unspecified;
// use the earliest date that can be represented as a file time.
DateTime dtUnspecified = DateTime.Parse("1601-01-01");

Console.WriteLine(
    dtUnspecified.ToFileTime() + "\n" +
    dtUnspecified.ToFileTimeUtc()
);
Run Code Online (Sandbox Code Playgroud)

美国东部时区的示例输出:

180000000000  // 1601-01-01T05:00:00Z - 5 AM UTC
0             // 1601-01-01T00:00:00Z - midnight UTC
Run Code Online (Sandbox Code Playgroud)