รับวันที่ปัจจุบันเป็นมิลลิวินาที


94

มีใครช่วยให้ฉันทราบวิธีรับวันที่ปัจจุบันเป็นมิลลิวินาทีได้ไหม



เมื่อคุณพูดวันที่ปัจจุบันเป็นมิลลิวินาทีคุณหมายถึงอะไร? คุณสามารถให้ตัวอย่างผลลัพธ์ที่คุณคาดหวังสำหรับวันที่ระบุได้หรือไม่?
lnafziger

คำตอบ:


103

มีหลายวิธีในการทำเช่นนี้แม้ว่าฉันจะชอบ:

CFAbsoluteTime timeInSeconds = CFAbsoluteTimeGetCurrent();

คุณสามารถอ่านเพิ่มเติมเกี่ยวกับวิธีการนี้ที่นี่ คุณยังสามารถสร้างออบเจ็กต์ NSDate และรับเวลาโดยเรียกใช้timeIntervalSince1970ซึ่งส่งคืนวินาทีตั้งแต่ 1/1/1970:

NSTimeInterval timeInSeconds = [[NSDate date] timeIntervalSince1970];

และใน Swift:

let timeInSeconds: TimeInterval = Date().timeIntervalSince1970

4
ฉันกำลังลองใช้รหัสต่อไปนี้ NSTimeInterval milisecondedDate = ([[วันที่ NSDate] timeIntervalSince1970] * 1000); NSLog (@ "didReceiveResponse ----% d", milisecondedDate);
ศิวะ

2
ปัญหาอยู่ที่คำสั่ง NSLog NSTimeInterval เป็น double type ดังนั้นคุณควรใช้% f แทน% d
Pawel

55
[[NSDate date] timeIntervalSince1970] ส่งคืน NSTimeInterval ซึ่งเป็นระยะเวลาเป็นวินาทีไม่ใช่มิลลิวินาที
Erik van der Neut

12
โปรดทราบว่าผลตอบแทนที่ได้เวลาเมื่อเทียบกับวันที่อ้างอิงCFAbsoluteTimeGetCurrent() Jan 1 2001 00:00:00 GMTไม่ใช่ว่ามีการระบุวันที่อ้างอิงในคำถาม แต่โปรดทราบว่านี่ไม่ใช่การประทับเวลา UNIX
nyi

2
[[NSDate date] timeIntervalSince1970] คืนค่าเวลาเป็นวินาทีและไม่ใช่หน่วยมิลลิวินาที
SAPLogix

61

การแคสต์ NSTimeInterval โดยตรงไปยังความยาวที่ล้นสำหรับฉันดังนั้นฉันจึงต้องร่ายยาวแทน

long long milliseconds = (long long)([[NSDate date] timeIntervalSince1970] * 1000.0);

ผลลัพธ์คือการประทับเวลา 13 หลักเช่นเดียวกับใน Unix


4
สิ่งนี้จะไม่ส่งคืนมิลลิวินาทีที่แท้จริงเนื่องจาก timeIntervalSince1970 ส่งคืนช่วงเวลาเป็นวินาทีดังนั้นเราจึงไม่มีความแม่นยำระดับมิลลิวินาทีที่ต้องการ
Danpe

9
timeIntervalSince1970 วิธีการไม่กลับมาในวินาทีกับจำนวนทั้งหมด แต่ก็เป็นdoubleที่ยังมีเศษส่วนที่สองเช่นกันซึ่งสามารถแปลง arithmetically เพื่อมิลลิวินาที ดังนั้นการคูณด้วย 1,000
wileymab

@wileymap ใช่คุณพูดถูก ฉันคิดออกในภายหลัง
Danpe

2
long longเหรอ? ภาษานี้แปลกมาก
924

@ user924 ไม่เห็นด้วยมากกว่านี้ นั่นเป็นเหตุผลที่ฉันหยุดเขียนมัน ;)
wileymab

10
NSTimeInterval milisecondedDate = ([[NSDate date] timeIntervalSince1970] * 1000);

ฉันกำลังลองใช้รหัสต่อไปนี้ NSTimeInterval milisecondedDate = ([[วันที่ NSDate] timeIntervalSince1970] * 1000); NSLog (@ "didReceiveResponse ----% d", milisecondedDate); - แต่แสดงค่าเป็นค่าลบ - เช่น ResponseTIME ---- 556610175 ResponseTIME ---- -1548754395
ศิวะ

1
ลองใช้ตัวยึดตำแหน่ง% f แทน% d หากไม่ได้ผล - ลบการคูณด้วย 1,000
Eimantas

@ Eimantas เมื่อฉันพยายามใช้% f ... ฉันได้เวลาเป็น Follows Response Time = 1306494959011.239014 เวลาตอบสนอง = 1306494910724.744141 ถ้าเป็น ms เวลาข้างต้นจะมากกว่าหนึ่งชั่วโมง
ศิวะ

วันที่ปัจจุบันเป็นช่วงเวลาเป็นวินาทีตั้งแต่ปี 1970 คุณไม่ได้พูดถึงวันอ้างอิงอะไรเลย
Eimantas

ฉันจะใช้ช่วงเวลาวันที่ปัจจุบันเท่านั้น
ศิวะ

8
extension NSDate {

    func toMillis() -> NSNumber {
        return NSNumber(longLong:Int64(timeIntervalSince1970 * 1000))
    }

    static func fromMillis(millis: NSNumber?) -> NSDate? {
        return millis.map() { number in NSDate(timeIntervalSince1970: Double(number) / 1000)}
    }

    static func currentTimeInMillis() -> NSNumber {
        return NSDate().toMillis()
    }
}

7

คุณสามารถทำได้:

long currentTime = (long)(NSTimeInterval)([[NSDate date] timeIntervalSince1970]);

สิ่งนี้จะส่งคืนค่าเป็นมิลลิวินาทีดังนั้นหากคุณคูณค่าผลลัพธ์ด้วย 1000 (ตามที่ Eimantas แนะนำของฉัน) คุณจะล้นประเภทยาวและจะส่งผลให้เป็นค่าลบ

ตัวอย่างเช่นถ้าฉันเรียกใช้รหัสนั้นในตอนนี้มันจะส่งผล

currentTime = 1357234941

และ

currentTime /seconds / minutes / hours / days = years
1357234941 / 60 / 60 / 24 / 365 = 43.037637652207

5

@JavaZava วิธีแก้ปัญหาของคุณดี แต่ถ้าคุณต้องการมีค่ายาว 13 หลักเพื่อให้สอดคล้องกับการจัดรูปแบบการประทับเวลาใน Java หรือ JavaScript (และภาษาอื่น ๆ ) ให้ใช้วิธีนี้:

NSTimeInterval time = ([[NSDate date] timeIntervalSince1970]); // returned as a double
long digits = (long)time; // this is the first 10 digits
int decimalDigits = (int)(fmod(time, 1) * 1000); // this will get the 3 missing digits
long timestamp = (digits * 1000) + decimalDigits;

หรือ (หากคุณต้องการสตริง):

NSString *timestampString = [NSString stringWithFormat:@"%ld%d",digits ,decimalDigits];

NSString * timestampString = [NSString stringWithFormat: @ "% ld% 03d", หลัก, decimalDigits]; ถูกต้องตามความเป็นจริง ในกรณีของคุณถ้าค่า decimalDigits น้อยกว่า 100 จะให้ผลลัพธ์ที่ไม่ถูกต้อง
PANKAJ VERMA

4

ตามที่กล่าวไว้ก่อนหน้านี้ [[NSDate date] timeIntervalSince1970] จะส่งคืน NSTimeInterval ซึ่งเป็นระยะเวลาเป็นวินาทีไม่ใช่มิลลิวินาที

คุณสามารถไปที่https://currentmillis.com/เพื่อดูว่าคุณจะได้ภาษาที่คุณต้องการได้อย่างไร นี่คือรายการ -

ActionScript    (new Date()).time
C++ std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count()
C#.NET  DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
Clojure (System/currentTimeMillis)
Excel / Google Sheets*  = (NOW() - CELL_WITH_TIMEZONE_OFFSET_IN_HOURS/24 - DATE(1970,1,1)) * 86400000
Go / Golang time.Now().UnixNano() / 1000000
Hive*   unix_timestamp() * 1000
Java / Groovy / Kotlin  System.currentTimeMillis()
Javascript  new Date().getTime()
MySQL*  UNIX_TIMESTAMP() * 1000
Objective-C (long long)([[NSDate date] timeIntervalSince1970] * 1000.0)
OCaml   (1000.0 *. Unix.gettimeofday ())
Oracle PL/SQL*  SELECT (SYSDATE - TO_DATE('01-01-1970 00:00:00', 'DD-MM-YYYY HH24:MI:SS')) * 24 * 60 * 60 * 1000 FROM DUAL
Perl    use Time::HiRes qw(gettimeofday); print gettimeofday;
PHP round(microtime(true) * 1000)
PostgreSQL  extract(epoch FROM now()) * 1000
Python  int(round(time.time() * 1000))
Qt  QDateTime::currentMSecsSinceEpoch()
R*  as.numeric(Sys.time()) * 1000
Ruby    (Time.now.to_f * 1000).floor
Scala   val timestamp: Long = System.currentTimeMillis
SQL Server  DATEDIFF(ms, '1970-01-01 00:00:00', GETUTCDATE())
SQLite* STRFTIME('%s', 'now') * 1000
Swift*  let currentTime = NSDate().timeIntervalSince1970 * 1000
VBScript / ASP  offsetInMillis = 60000 * GetTimeZoneOffset()
WScript.Echo DateDiff("s", "01/01/1970 00:00:00", Now()) * 1000 - offsetInMillis + Timer * 1000 mod 1000

เพื่อวัตถุประสงค์ CI ทำสิ่งที่ต้องการด้านล่างเพื่อพิมพ์ -

long long mills = (long long)([[NSDate date] timeIntervalSince1970] * 1000.0);
 NSLog(@"Current date %lld", mills);

หวังว่าสิ่งนี้จะช่วยได้




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

0

(long)(NSTimeInterval)([[NSDate date] timeIntervalSince1970])การใช้งานนี้จะได้รับเวลาเป็นมิลลิวินาที


0

การขยายวันที่น่าจะเป็นวิธีที่ดีที่สุด

extension NSDate {
    func msFromEpoch() -> Double {
        return self.timeIntervalSince1970 * 1000
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.