如何将NSDate转换为Unix时间戳iPhone SDK?


143

如何转换NSDate成Unix时间戳?我读过许多相反的文章。但是我没有找到与我的问题有关的任何东西。

Answers:


269

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

- (NSTimeInterval)timeIntervalSince1970

2
如果提供了nsdate,这是否会返回unix时间戳?
neha 2010年

1
是的,这正是您想要的。UNIX以秒为单位测量自1970年1月1日以来的时间,该方法返回接收器(您提供的NSDate)与1970年1月1日GMT的第一个瞬间之间的间隔。NSTimeInterval实际上是double的typedef。
BAndonovski

26
要获取字符串(28/11/2011 14:14:13 <-> 1322486053):[NSString stringWithFormat:@“%。0f”,[aDate timeIntervalSince1970]];
2011年

2
通常,该方法会根据设备上设置的时间进行更改。我进行了一次测试,我在12点获得了时间戳,然后在iPad上将时间更改为大约8点,这两个数字之间的差异非常大。如果时间戳不受设备时间的影响,那么数字应该仅相差几秒钟,但是在这种情况下,我不得不得出结论,iPad上的时间确实会影响unixTimeStamp
Esko918 2013年

1
@ Esko918当然可以。Unix时间描述了从1970到要指定的时间点的秒数(本例中为“现在”)。如果您在iPad上更改时间,则可以有效地将“现在”更改为其他时间,从而也可以更改时间戳。
marsbear's

69

Unix时间戳是从1970年开始它的由类型表示00:00:00 UTC 1月1日的秒数time_t的,它通常是一个带符号的32位整数类型(长或INT)。

iOS 为NSDate对象提供了-(NSTimeInterval)timeIntervalSince1970,该对象返回自1970年1月1日格林尼治标准时间00:00:00起的秒数。

由于它们都具有相同的引用(1970年1月1日午夜UTC)并且都以秒为单位,因此转换很容易,因此可以将NSTimeInterval转换为time_t,根据需要舍入或截断:

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

此功能可显示正确的日期,但时间不正确。与系统时间不符。
neha 2010年

Unix时间是UTC(GMT),印度是UTC + 5.5。到5.5小时了吗?
progrmr 2010年

7
您的系统时间显示的是您当地时区的时间,这很好。Unix时间戳记不是本地时间,它始终是UTC时间,在印度,它的差值为+5:30,此处的差值为-7:00。没错
progrmr 2010年

但是那怎么用呢?以后可以在计算中使用它吗?我有一个在线的PHP数据库中的UNIX时间戳,然后是这个。我想比较两者,以便决定下载有关对象的最新数据。
JeroenEijkhof

我现在正在执行此操作:int unixTime = floor([piece.piece_last_view timeIntervalSince1970]) 其中piece.piece.last_view是NSDate
JeroenEijkhof 2011年

26

您可以通过以下方式从日期创建Unix时间戳日期:

NSTimeInterval timestamp = [[NSDate date] timeIntervalSince1970];

21
这是错误的,timeIntervalSince1970返回一个TimeInterval,它实际上是一个double。
马特·沃尔夫

9
- (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时间。


6

迅速

为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)

5

如果要将这些时间存储在数据库中或通过服务器发送...最好是使用Unix时间戳。这是一个小片段:

+ (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]]?请少解释。
Hemang,2015年

嗨,朋友帮了我
Rahul K Rajan'1


4

按照@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]);
k3a 2014年

我遇到了[[NSDate date] timeIntervalSince1970]的问题。他们似乎也考虑您所在的地区。
Tapan Thaker 2014年

是的,这就是我当天遇到的情况,但是在具有GMT + 2时区的iOS7 Simulator和iOS6设备上,它们现在似乎相等...无论如何,time(NULL)始终有效:)
k3a

2
 [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


0

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

time_t result = time(NULL);                
NSString *timeStampString = [@(result) stringValue];
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.