如何将 NSDate 转换为 unix 时间戳 iphone sdk?

Posted

技术标签:

【中文标题】如何将 NSDate 转换为 unix 时间戳 iphone sdk?【英文标题】:How to convert NSDate into unix timestamp iphone sdk? 【发布时间】:2011-03-01 03:17:04 【问题描述】:

如何将NSDate 转换为 Unix 时间戳?我读过很多相反的帖子。但我没有找到与我的问题相关的任何内容。

【问题讨论】:

【参考方案1】:

我相信这是您正在寻找的 NSDate 选择器:

- (NSTimeInterval)timeIntervalSince1970

【讨论】:

如果提供了 nsdate,这会返回 unix 时间戳吗? 是的,这正是您要找的。 UNIX 以 1970 年 1 月 1 日以来的秒数为单位测量时间,并且此方法返回接收者(您提供的 NSDate)与 1970 年 1 月 1 日格林威治标准时间的第一时刻之间的时间间隔。 NSTimeInterval 实际上是 double 的 typedef。 获取字符串 (28/11/2011 14:14:13 1322486053) : [NSString stringWithFormat:@"%.0f", [aDate timeIntervalSince1970]]; 该方法一般会根据设备上设置的时间而改变。我做了一个测试,我在中午 12 点得到时间戳,然后在 iPad 上将时间更改为晚上 8 点左右,这两个数字的差异非常大。如果时间戳与设备时间无关,则数字应该仅相差几秒钟,但在这种情况下,我不得不得出结论,iPad 上的时间确实会影响 unixTimeStamp @Esko918 当然可以。 Unix 时间描述了从 1970 年到您要指定的时间点的秒数(在本例中为“现在”)。如果您更改 iPad 上的时间,您实际上会将“现在”更改为其他时间,从而导致时间戳的差异。【参考方案2】:

Unix timestamp 是自 1970 年 1 月 1 日 00:00:00 UTC 以来的秒数。它由类型 time_t 表示,通常是带符号的 32 位整数类型(long 或 int)。

ios 为 NSDate 对象提供 -(NSTimeInterval)timeIntervalSince1970,它返回自 1970 年 1 月 1 日格林威治标准时间 00:00:00 以来的秒数。NSTimeInterval 是双浮点类型,因此您可以获得秒数和秒的小数部分。

由于它们都具有相同的参考(UTC 时间 1 月 1 日午夜)并且都以秒为单位进行转换很容易,将 NSTimeInterval 转换为 time_t,根据您的需要进行舍入或截断:

time_t unixTime = (time_t) [[NSDate date] timeIntervalSince1970];

【讨论】:

此功能显示正确的日期,但时间错误。它与系统时间不匹配。 Unix 时间是 UTC (GMT),印度是 UTC+5.5。 5.5 小时后关闭吗? 您的系统时间显示的是您当地时区的时间,这很好。 Unix 时间戳不是本地时间,它始终是 UTC 时间,印度的时间差为 +5:30,这里的时间差为 -7:00。没错。 那么如何使用呢?我可以在以后的计算中使用它吗?我有一个来自在线 php 数据库的 UNIX 时间戳,然后是这个。我想比较这两者,以便决定是否下载有关对象的最新数据。 我现在正在这样做:int unixTime = floor([piece.piece_last_view timeIntervalSince1970]) 其中piece.piece.last_view 是一个NSDate【参考方案3】:

您可以通过这种方式从日期创建 unix 时间戳日期:

NSTimeInterval timestamp = [[NSDate date] timeIntervalSince1970];

【讨论】:

这是错误的,timeIntervalSince1970 返回的 TimeInterval 实际上是一个 double。【参考方案4】:
- (void)GetCurrentTimeStamp
    
        NSDateFormatter *objDateformat = [[NSDateFormatter alloc] init];
        [objDateformat setDateFormat:@"yyyy-MM-dd"];
        NSString    *strTime = [objDateformat stringFromDate:[NSDate date]];
        NSString    *strUTCTime = [self GetUTCDateTimeFromLocalTime:strTime];//You can pass your date but be carefull about your date format of NSDateFormatter.
        NSDate *objUTCDate  = [objDateformat dateFromString:strUTCTime];
        long long milliseconds = (long long)([objUTCDate timeIntervalSince1970] * 1000.0);

        NSString *strTimeStamp = [Nsstring stringwithformat:@"%lld",milliseconds];
        NSLog(@"The Timestamp is = %@",strTimestamp);
    

 - (NSString *) GetUTCDateTimeFromLocalTime:(NSString *)IN_strLocalTime
    
        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setDateFormat:@"yyyy-MM-dd"];
        NSDate  *objDate    = [dateFormatter dateFromString:IN_strLocalTime];
        [dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
        NSString *strDateTime   = [dateFormatter stringFromDate:objDate];
        return strDateTime;
    

注意:- 时间戳必须在 UTC 区域,所以我将我们的本地时间转换为 UTC 时间。

【讨论】:

【参考方案5】:

斯威夫特

为 Swift 3 更新

// current date and time
let someDate = Date()

// time interval since 1970
let myTimeStamp = someDate.timeIntervalSince1970

备注

timeIntervalSince1970 返回TimeInterval,这是Double 的类型别名。

如果你想走另一条路,你可以这样做:

  let myDate = Date(timeIntervalSince1970: myTimeStamp)

【讨论】:

【参考方案6】:

如果您想将这些时间存储在数据库中或通过服务器发送...最好使用 Unix 时间戳。这是一个小sn-p来获得它:

+ (NSTimeInterval)getUTCFormateDate

    NSDateComponents *comps = [[NSCalendar currentCalendar] 
                               components:NSDayCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit 
                               fromDate:[NSDate date]];
    [comps setHour:0];
    [comps setMinute:0];    
    [comps setSecond:[[NSTimeZone systemTimeZone] secondsFromGMT]];

    return [[[NSCalendar currentCalendar] dateFromComponents:comps] timeIntervalSince1970];  

【讨论】:

为什么在组件中将小时和分钟设置为 0?此外,它如何根据以下内容为您提供准确的 UTC:[[NSTimeZone systemTimeZone] secondsFromGMT]]?请解释一下。 你好朋友它帮助了我【参考方案7】:

我喜欢的方式很简单:

NSDate.date.timeIntervalSince1970;

【讨论】:

【参考方案8】:

根据@kexik 的建议,使用 UNIX 时间函数如下:

  time_t result = time(NULL);
  NSLog([NSString stringWithFormat:@"The current Unix epoch time is %d",(int)result]);

。根据我的经验 - 不要使用 timeIntervalSince1970 ,它会给出纪元时间戳 - 您落后 GMT 的秒数。

以前 [[NSDate date]timeIntervalSince1970] 有一个错误,它曾经根据手机的时区添加/减去时间,但现在似乎已解决。

【讨论】:

我正在纠正我的答案 - 它似乎真的是平等的。虽然 time(NULL) 可能会快一点,因为它没有调用 obj-c 运行时。 :P 测试代码 NSLog(@"time(NULL) = %d ; timeIntervalSince1970 = %d", (int)time(NULL), (int)[[NSDate date] timeIntervalSince1970]); 我遇到了 [[NSDate date]timeIntervalSince1970] 的问题。他们似乎也考虑了您所在的地区。 是的,这就是我认为我那天所经历的,但在 iOS7 模拟器和具有 GMT+2 时区的 iOS6 设备上,它们现在看起来相等......无论如何,时间(NULL)总是有效的 :)跨度> 【参考方案9】:
 [NSString stringWithFormat: @"first unixtime is %ld",message,(long)[[NSDate date] timeIntervalSince1970]];

 [NSString stringWithFormat: @"second unixtime is %ld",message,[[NSDate date] timeIntervalSince1970]];

 [NSString stringWithFormat: @"third unixtime is %.0f",message,[[NSDate date] timeIntervalSince1970]]; 

第一个unixtime 1532278070

第二个unixtime 1532278070.461380

第三个unixtime 1532278070

【讨论】:

【参考方案10】:

如果您需要时间戳作为字符串。

time_t result = time(NULL);                
NSString *timeStampString = [@(result) stringValue];

【讨论】:

以上是关于如何将 NSDate 转换为 unix 时间戳 iphone sdk?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PHP 将 MySQL 时间转换为 UNIX 时间戳?

如何使用 Shell 将 ISO 8601 时间戳转换为 Unix 时间戳?

如何将 SQL Server SMALLDATETIME 转换为 Unix 时间戳?

以时间戳格式获取当前 NSDate

如何将日期时间转换为 c 中的 unix 时间戳?

如何将周数和年份转换为 unix 时间戳?