获取当前时间的毫秒数

99

有没有人能告诉我如何以毫秒为单位获取当前日期?


当你说当前日期的毫秒数时,你指的是什么?你能提供一个特定日期的预期输出示例吗? - lnafziger
12个回答

107

有几种方法可以实现这个功能,尽管我个人最喜欢的是:

CFAbsoluteTime timeInSeconds = CFAbsoluteTimeGetCurrent();

你可以在这里了解更多有关该方法的信息。你也可以创建一个NSDate对象并通过调用timeIntervalSince1970来获取时间,该方法返回自1970年1月1日以来的秒数

NSTimeInterval timeInSeconds = [[NSDate date] timeIntervalSince1970];

而在Swift中:

let timeInSeconds: TimeInterval = Date().timeIntervalSince1970

4
我正在尝试以下代码 NSTimeInterval milisecondedDate = ([[NSDate date] timeIntervalSince1970] * 1000);NSLog(@"didReceiveResponse ---- %d",milisecondedDate); - siva
2
问题出在 NSLog 语句上。NSTimeInterval 是一种 typedefed double 类型,因此应该使用 %f 而不是 %d。 - Pawel
59
[[NSDate date] timeIntervalSince1970] 返回一个 NSTimeInterval,它是一个以秒为单位的时长,而不是毫秒。 - Erik van der Neut
12
请注意,CFAbsoluteTimeGetCurrent()返回相对于参考日期Jan 1 2001 00:00:00 GMT的时间。虽然问题中没有给出参考日期,但要注意这不是UNIX时间戳。 - nyi
2
[[NSDate date] timeIntervalSince1970] 返回的是秒数而不是毫秒数。 - SAPLogix
显示剩余5条评论

64
将NSTimeInterval直接转换为long类型时会发生溢出,因此我不得不将其转换为long long类型。
long long milliseconds = (long long)([[NSDate date] timeIntervalSince1970] * 1000.0);

结果是一个13位时间戳,就像Unix中的时间戳。


5
这不会返回实际的毫秒数,因为timeIntervalSince1970返回的是以秒为单位的时间间隔,所以我们无法获得所需的毫秒精度。 - Danpe
9
timeIntervalSince1970 方法返回的是距离 1970 年以来的秒数,但它返回一个 double 类型,其中包括了小数秒,可以通过简单的算术运算将其转换为毫秒。因此,需要乘以1000。 - wileymab
@wileymap 是的,你说得对。我后来想通了。 - Danpe
2
long long?这种语言太奇怪了。 - user924
@user924 完全同意。这就是为什么我停止写它的原因。 ;) - wileymab

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

1
尝试使用%f占位符代替%d。如果这不起作用,请删除乘以1000的部分。 - Eimantas
@Eimantas,当我尝试使用%f时... 我得到的时间如下:响应时间=1306494959011.239014 响应时间=1306494910724.744141 如果是毫秒,则上述时间超过一小时。 - siva
当前日期是自1970年以来的秒数时间间隔。您没有提及任何参考日期。 - Eimantas
我现在完全不理解你的要求。 - Eimantas
我是说,我想以毫秒的形式显示当前日期,请提供正确的解决方案。 - siva
显示剩余3条评论

7
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建议),则会溢出long类型并导致负值。

例如,如果我现在运行该代码,它将会导致

currentTime = 1357234941

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

5

如前所述,[[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

对于Objective C,我做了以下操作以打印它 -

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

希望这能帮到你。

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", digits, decimalDigits]; 实际上是正确的。在您的情况下,如果decimalDigits的值小于100将会产生错误的结果。 - PANKAJ VERMA

1
NSTimeIntervalmilisecondedDate 值转换为 nsstring,然后再将其转换为 int

0

您可以使用以下方法获取当前时间的毫秒数。

[[NSDate date] timeIntervalSince1970];

或者

double CurrentTime = CACurrentMediaTime(); 

源代码: iPhone:如何获取当前毫秒数?


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接