Làm cách nào để chuyển đổi NSDate thành sdk dấu thời gian unix?


143

Làm thế nào để chuyển đổi một NSDatedấu thời gian thành Unix? Tôi đã đọc nhiều bài viết làm ngược lại. Nhưng tôi không tìm thấy bất cứ điều gì liên quan đến câu hỏi của tôi.

Câu trả lời:


269

Tôi tin rằng đây là công cụ chọn của NSDate mà bạn đang tìm kiếm:

- (NSTimeInterval)timeIntervalSince1970

2
Điều này có trả về dấu thời gian unix nếu được cung cấp với một nsdate không?
neha

1
Vâng, đây chính xác là những gì bạn đang tìm kiếm. UNIX đo thời gian tính bằng giây kể từ ngày 1 tháng 1 năm 1970 và phương pháp này trả về khoảng thời gian giữa người nhận (NSDate bạn cung cấp) và tức thì đầu tiên vào ngày 1 tháng 1 năm 1970, GMT. NSTimeInterval thực sự là một typedef của double.
BAndonovski

26
Để nhận chuỗi (28/11/2011 14:14:13 <-> 1322486053): [NSString chuỗiWithFormat: @ "%. 0f", [aDate timeIntervalSince1970]];
ɾɾɾǝʞ

2
Phương pháp được thay đổi theo thời gian được đặt trên thiết bị nói chung. Tôi đã thực hiện một thử nghiệm trong đó tôi nhận được dấu thời gian vào lúc 12 giờ tối, sau đó thay đổi khoảng thời gian trên iPad thành khoảng 8 giờ tối và sự khác biệt trong hai con số là cực kỳ cao. Nếu dấu thời gian không phụ thuộc vào thời gian của thiết bị thì các số đó sẽ bị tắt chỉ trong vài giây, nhưng trong trường hợp này tôi đã phải kết luận rằng thời gian trên iPad có ảnh hưởng đến unixTimeStamp
Esko918

1
@ Esko918 Tất nhiên rồi. Thời gian Unix mô tả số giây từ năm 1970 đến thời điểm bạn muốn chỉ định ("bây giờ" trong trường hợp này). Nếu bạn thay đổi thời gian trên iPad, bạn sẽ thay đổi "ngay bây giờ" một cách hiệu quả sang một thời điểm khác và do đó có sự khác biệt về dấu thời gian.
marsbear

69

Một Unix timestamp là số giây kể từ 00:00:00 UTC ngày 1 tháng 1 năm 1970. Nó được đại diện bởi kiểu time_t , mà thường là một ký 32-bit integer loại (dài hoặc int).

iOS cung cấp - (NSTimeInterval) timeIntervalSince1970 cho các đối tượng NSDate trả về số giây kể từ 00:00:00 GMT ngày 1 tháng 1 năm 1970. NSTimeInterval là loại dấu phẩy động kép để bạn có được giây và phân số của giây.

Vì cả hai đều có cùng một tham chiếu (nửa đêm 1Jan1970 UTC) và cả hai giây đều dễ dàng chuyển đổi, chuyển đổi NSTimeInterval thành time_t, làm tròn hoặc cắt bớt tùy theo nhu cầu của bạn:

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

Hàm này hiển thị cho tôi ngày chính xác nhưng thời gian là sai. Nó không phù hợp với thời gian hệ thống.
neha

Giờ Unix là UTC (GMT), Ấn Độ là UTC + 5.5. Có tắt 5,5 giờ không?
progrmr

7
Thời gian hệ thống của bạn đang hiển thị thời gian trong múi giờ địa phương của bạn, điều này là tốt. Dấu thời gian Unix không phải là giờ địa phương, nó luôn là giờ UTC, nó khác với +5: 30 ở Ấn Độ, -7: 00 từ đây. Đúng rồi.
progrmr

Nhưng sau đó làm thế nào để sử dụng nó? Tôi có thể sử dụng nó trong tính toán của tôi sau này không? Tôi có một dấu thời gian UNIX từ cơ sở dữ liệu PHP trực tuyến và sau đó là cơ sở dữ liệu này. Tôi muốn so sánh cả hai để đưa ra quyết định tải xuống dữ liệu mới nhất về một đối tượng.
JeroenEijkhof

Tôi chỉ đang làm điều này ngay bây giờ: int unixTime = floor([piece.piece_last_view timeIntervalSince1970]) trong đó mảnh. Mảnh.last_view là một NSDate
JeroenEijkhof

26

Bạn có thể tạo một dấu thời gian unix từ một ngày theo cách này:

NSTimeInterval timestamp = [[NSDate date] timeIntervalSince1970];

21
Điều này là sai, timeIntervalSince1970 trả về TimeInterval thực sự là gấp đôi.
Matt Wolfe

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;
    }

LƯU Ý: - Dấu thời gian phải nằm trong Vùng UTC, vì vậy tôi chuyển đổi Giờ địa phương của chúng tôi thành Giờ UTC.


6

Nhanh

Đã cập nhật cho Swift 3

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

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

Ghi chú

  • timeIntervalSince1970trả về TimeInterval, đó là một typealias cho Double.

  • Nếu bạn muốn đi theo con đường khác, bạn có thể làm như sau:

      let myDate = Date(timeIntervalSince1970: myTimeStamp)

5

Nếu bạn muốn lưu trữ thời gian này trong cơ sở dữ liệu hoặc gửi nó qua máy chủ ... tốt nhất là sử dụng dấu thời gian Unix. Đây là một đoạn nhỏ để có được điều đó:

+ (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];  
}

Tại sao bạn lại đặt giờ và phút thành 0 trong các thành phần? Ngoài ra, làm thế nào nó sẽ cung cấp cho bạn UTC chính xác dựa trên điều này : [[NSTimeZone systemTimeZone] secondsFromGMT]]? Hãy giải thích một chút.
Hemang

Chào bạn, nó đã giúp tôi
Rahul K Rajan

5

Cách ưa thích của tôi chỉ đơn giản là:

NSDate.date.timeIntervalSince1970;

4

Theo đề xuất của @ kexik bằng cách sử dụng chức năng thời gian UNIX như dưới đây:

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

.Như theo kinh nghiệm của tôi - không sử dụng timeIntervalSince1970, nó mang lại dấu thời gian epoch - số giây bạn đứng sau GMT.

Đã từng có một lỗi với [[ngày NSDate] timeIntervalSince1970], nó được sử dụng để thêm / bớt thời gian dựa trên múi giờ của điện thoại nhưng dường như nó đã được giải quyết ngay bây giờ.


Tôi đang sửa câu trả lời của mình - nó thực sự có vẻ như bằng nhau. Mặc dù thời gian (NULL) có thể nhanh hơn một chút vì nó không gọi thời gian chạy obj-c. : P Mã kiểm tra NSLog (@ "time (NULL) =% d; timeIntervalSince1970 =% d", (int) time (NULL), (int) [[NSDate date] timeIntervalSince1970]);
k3a

Tôi đã gặp vấn đề với [[ngày NSDate] timeIntervalSince1970]. Họ dường như xem xét khu vực bạn đang ở là tốt.
Tapan Thaker

Vâng, đây là những gì tôi nghĩ rằng tôi đã trải nghiệm ngày hôm đó nhưng trên iOS7 Simulator và thiết bị iOS6 với múi giờ GMT + 2 giờ đây dường như bằng nhau ... Dù sao, thời gian (NULL) luôn hoạt động :)
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]]; 

lần đầu tiên 1532278070

lần thứ hai 1532278070.461380

lần thứ ba 1532278070


0

Nếu bạn cần tem thời gian như một chuỗi.

time_t result = time(NULL);                
NSString *timeStampString = [@(result) stringValue];
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.