You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Objective-C中将NSDate转换为Ticks格式?附示例与预期结果

在Objective-C中将NSDate转换为.NET风格Ticks格式

我来帮你搞定这个转换问题——你要的其实是把NSDate转换成**.NET风格的Ticks**(也就是从公元1年1月1日00:00:00 UTC开始,以100纳秒为单位的计数),你的预期结果正好符合这个规则。

先提一句:你给出的代码片段有个小语法错误,NSDate *date = NSDate *conversionDate = ... 这种写法是不对的,我会在下面的实现里修正这个问题。

完整实现代码

// 1. 初始化日期格式化器,解析目标日期字符串
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"dd-MM-yyyy HH:mm:ss"];
[dateFormat setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]]; // 关键:基于UTC解析,避免时区偏差
NSDate *conversionDate = [dateFormat dateFromString:@"29-03-2018 00:00:00"];

// 2. 定义.NET Ticks的起始参考日期:0001-01-01 00:00:00 UTC
NSDateFormatter *netEpochFormatter = [[NSDateFormatter alloc] init];
[netEpochFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
[netEpochFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];
NSDate *netEpochDate = [netEpochFormatter dateFromString:@"0001-01-01 00:00:00"];

// 3. 计算两个参考日期的时间差:NSDate的参考点(2001-01-01 UTC)到.NET起始点的秒数
NSTimeInterval nsReferenceToNetEpoch = [[NSDate dateWithTimeIntervalSinceReferenceDate:0] timeIntervalSinceDate:netEpochDate];

// 4. 计算目标日期到NSDate参考点的秒数
NSTimeInterval targetToNSReference = [conversionDate timeIntervalSinceReferenceDate];

// 5. 总秒数 = 两个间隔之和,再转换为Ticks(1 Tick = 100纳秒 = 1e-7秒)
long long totalTicks = (long long)((nsReferenceToNetEpoch + targetToNSReference) * 10000000LL);

// 输出结果,和你的预期一致
NSLog(@"Ticks = %lld", totalTicks); // 打印:636579950240000000

关键细节说明

  • 时区处理:一定要把日期格式化器的时区设置为UTC,因为NSDate本质是UTC时间,而.NET的Ticks也是基于UTC计算的,不这么做会导致时区偏移,结果出错。
  • 数值类型:Ticks的数值极大,必须用long long(64位整数)存储,否则会出现溢出问题;计算时用10000000LL确保是64位常量,避免整数截断。
  • 参考日期差值:NSDate的默认参考点是2001年1月1日UTC,而.NET的Ticks参考点是公元1年1月1日UTC,所以我们需要先算出这两个参考点之间的时间差,再叠加目标日期到NSDate参考点的间隔。

额外注意

如果你的输入日期字符串是本地时区的,只需要调整dateFormat的timeZone为本地时区即可,但最终计算Ticks时,所有日期都要统一到UTC维度,保证结果准确。

内容的提问来源于stack exchange,提问作者Naveen Babu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:12:12