วิธีแปลง NSDate เป็น unix timestamp iphone sdk?


143

วิธีการแปลงเป็นNSDateUnix timestamp? ฉันได้อ่านโพสต์มากมายที่ทำตรงกันข้าม แต่ฉันไม่พบสิ่งที่เกี่ยวข้องกับคำถามของฉัน

คำตอบ:


269

ฉันเชื่อว่านี่เป็นตัวเลือกของ NSDate ที่คุณกำลังมองหา:

- (NSTimeInterval)timeIntervalSince1970

2
สิ่งนี้ส่งคืนการประทับเวลา unix หรือไม่หากได้รับ nsdate
neha

1
ใช่นี่คือสิ่งที่คุณกำลังมองหา UNIX วัดเวลาเป็นวินาทีตั้งแต่ jan 1st 1970 และวิธีนี้จะคืนค่าช่วงเวลาระหว่างผู้รับ (NSDate ที่คุณให้ไว้) และ instant ทันทีแรกของ 1 มกราคม 1970, GMT NSTimeInterval เป็นประเภทของ double
BAndonovski

26
ในการรับสตริง (28/11/2011 14:14:13 <-> 1322486053): [NSString stringWithFormat: @ "%. 0f", [วันที่ timeIntervalSince1970];
ıɾuǝʞ

2
วิธีการจะเปลี่ยนไปตามเวลาที่ตั้งไว้ในอุปกรณ์โดยทั่วไป ฉันทำการทดสอบที่ฉันได้รับการประทับเวลาเวลา 12.00 น. จากนั้นเปลี่ยนรอบเวลาบน iPad เป็นประมาณ 20.00 น. และความแตกต่างของตัวเลขสองตัวนั้นสูงมาก หากการประทับเวลาไม่ขึ้นอยู่กับเวลาของอุปกรณ์ตัวเลขควรจะถูกปิดโดยเพียงไม่กี่วินาที แต่ในกรณีนี้ฉันต้องสรุปว่าเวลาบน iPad จะส่งผลต่อ unixTimeStamp
Esko918

1
@ Esko918 แน่นอน เวลา Unix อธิบายจำนวนวินาทีจาก 1970 จนถึงเวลาที่คุณต้องการระบุ ("ตอนนี้" ในกรณีนี้) หากคุณเปลี่ยนเวลาบน iPad ของคุณคุณจะเปลี่ยน "ตอนนี้" เป็นเวลาอื่นอย่างมีประสิทธิภาพและด้วยเหตุนี้ความแตกต่างในการประทับเวลา
marsbear

69

การประทับเวลา Unixคือจำนวนวินาทีตั้งแต่ 00:00:00 UTC 1 มกราคม 1970 มันถูกแทนด้วยประเภทtime_tซึ่งโดยปกติแล้วจะเป็นชนิดจำนวนเต็ม 32 บิตที่ลงชื่อแล้ว (ยาวหรือ int)

iOS ให้- (NSTimeInterval) timeIntervalSince1970สำหรับออบเจ็กต์ NSDate ซึ่งส่งคืนจำนวนวินาทีตั้งแต่ 00:00:00 GMT 1 มกราคม 1970 NSTimeInterval เป็นประเภททศนิยมสองจุดเพื่อให้คุณได้รับวินาทีและเศษส่วนของวินาที

เนื่องจากทั้งคู่มีการอ้างอิงเดียวกัน (เที่ยงคืน 1 มกราคม 2519 UTC) และทั้งสองในไม่กี่วินาทีการแปลงนั้นง่ายแปลง NSTimeInterval ให้เป็น time_t, การปัดเศษหรือการตัดทอนขึ้นอยู่กับความต้องการของคุณ:

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

ฟังก์ชั่นนี้แสดงวันที่ที่ถูกต้อง แต่เวลาไม่ถูกต้อง มันไม่ตรงกับเวลาของระบบ
neha

เวลา Unix คือ UTC (GMT), อินเดียคือ UTC + 5.5 ปิดประมาณ 5.5 ชั่วโมงหรือไม่
progrmr

7
เวลาระบบของคุณแสดงเวลาในเขตเวลาท้องถิ่นของคุณซึ่งไม่เป็นไร เวลา Unix ไม่ใช่เวลาท้องถิ่นมันเป็นเวลา UTC เสมอมันแตกต่างจาก +5: 30 ในอินเดีย -7: 00 จากที่นี่ ถูกต้อง.
progrmr

แต่จะใช้มันอย่างไร? ฉันสามารถใช้มันในการคำนวณของฉันได้ในภายหลัง? ฉันมีเวลาหนึ่ง UNIX จากฐานข้อมูล PHP ออนไลน์แล้วอันนี้ ฉันต้องการเปรียบเทียบทั้งสองเพื่อทำการตัดสินใจในการดาวน์โหลดข้อมูลล่าสุดเกี่ยวกับวัตถุ
JeroenEijkhof

ฉันเพิ่งทำสิ่งนี้ตอนนี้int unixTime = floor([piece.piece_last_view timeIntervalSince1970]) โดยที่ piece.piece.last_view เป็น NSDate
JeroenEijkhof

26

คุณสามารถสร้างวันที่ประทับเวลา unix จากวันที่ด้วยวิธีนี้:

NSTimeInterval timestamp = [[NSDate date] timeIntervalSince1970];

21
นี่เป็นความผิดพลาด timeIntervalSince1970 จะส่งกลับ TimeInterval ซึ่งจริงๆแล้วเป็นสองเท่า
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;
    }

หมายเหตุ: - การประทับเวลาจะต้องอยู่ในโซน UTC ดังนั้นฉันจึงแปลงเวลาท้องถิ่นของเราเป็นเวลา UTC


6

รวดเร็ว

อัปเดตสำหรับ Swift 3

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

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

หมายเหตุ

  • timeIntervalSince1970ผลตอบแทนที่ได้TimeIntervalซึ่งเป็น typealias Doubleสำหรับ

  • หากคุณต้องการไปทางอื่นคุณสามารถทำสิ่งต่อไปนี้:

      let myDate = Date(timeIntervalSince1970: myTimeStamp)

5

หากคุณต้องการเก็บเวลาเหล่านี้ในฐานข้อมูลหรือส่งผ่านเซิร์ฟเวอร์ ... ดีที่สุดคือการใช้ Unix timestamps นี่เป็นตัวอย่างเล็กน้อยที่จะได้รับ:

+ (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

สวัสดีเพื่อนมันช่วยฉัน
Rahul K Rajan


4

ตามคำแนะนำของ @ kexik โดยใช้ฟังก์ชั่นเวลา UNIX ดังต่อไปนี้:

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

ตามประสบการณ์ของฉัน - อย่าใช้เวลาช่วงเวลานับตั้งแต่ปี 1970 มันให้เวลาประทับยุค - จำนวนวินาทีที่คุณอยู่หลัง GMT

เคยมีข้อผิดพลาดกับ [[วันที่ NSDate] timeIntervalSince1970] เคยใช้เพื่อเพิ่ม / ลบเวลาตามเขตเวลาของโทรศัพท์ แต่ดูเหมือนว่าจะได้รับการแก้ไขในขณะนี้


ฉันกำลังแก้ไขคำตอบของฉัน - ดูเหมือนว่าจะเท่ากัน แม้ว่าเวลา (NULL) อาจเร็วขึ้นเล็กน้อยเนื่องจากไม่เรียกใช้ obj-c runtime : P รหัสทดสอบ NSLog (@ "เวลา (NULL) =% d; timeIntervalSince1970 =% d", (int) เวลา (NULL), (int) [[วันที่ NSDate] timeIntervalSince1970];
k3a

ฉันประสบปัญหากับ [[วันที่ NSDate] timeIntervalSince1970] ดูเหมือนว่าพวกเขาจะพิจารณาภูมิภาคที่คุณอยู่ด้วยเช่นกัน
Tapan Thaker

ใช่นี่คือสิ่งที่ฉันคิดว่าฉันมีประสบการณ์ในวันนั้น แต่บน iOS7 Simulator และอุปกรณ์ iOS6 ที่มี GMT + 2 เขตเวลาตอนนี้พวกเขาดูเหมือนเท่ากัน ... อย่างไรก็ตามเวลา (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];
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.