获取当前日期(以毫秒为单位)

siv*_*iva 88 time cocoa-touch date objective-c ios

任何人都可以告诉我如何以毫秒为单位获取当前日期?

Paw*_*wel 98

有几种方法可以做到这一点,虽然我个人最喜欢的是:

CFAbsoluteTime timeInSeconds = CFAbsoluteTimeGetCurrent();
Run Code Online (Sandbox Code Playgroud)

您可以在此处详细了解此方法.您还可以通过调用timeIntervalSince1970创建一个NSDate对象并获取时间,该时间返回自1970年1月1日以来的秒数:

NSTimeInterval timeInSeconds = [[NSDate date] timeIntervalSince1970];
Run Code Online (Sandbox Code Playgroud)

在斯威夫特:

let timeInSeconds: TimeInterval = Date().timeIntervalSince1970
Run Code Online (Sandbox Code Playgroud)

  • [[NSDate date] timeIntervalSince1970]返回NSTimeInterval,它是以秒为单位的持续时间,而不是毫秒. (53认同)
  • 注意`CFAbsoluteTimeGetCurrent()`返回相对于参考日期`Jan 1 2001 00:00:00 GMT`的时间.并不是问题中给出了参考日期,但请注意,这不是UNIX时间戳. (10认同)
  • 我正在尝试下面的代码NSTimeInterval milisecondedDate =([[NSDate date] timeIntervalSince1970]*1000); NSLog(@"didReceiveResponse ----%d",milisecondedDate); (4认同)
  • 问题在于NSLog语句。NSTimeInterval是类型定义的双精度型。因此,您应该使用%f而不是%d。 (2认同)
  • [[NSDate date] timeIntervalSince1970]返回以秒为单位的时间,而不是以毫秒为单位。 (2认同)

wil*_*mab 60

将NSTimeInterval直接转换为对我来说很长的溢出,所以相反我不得不施展很长时间.

long long milliseconds = (long long)([[NSDate date] timeIntervalSince1970] * 1000.0);
Run Code Online (Sandbox Code Playgroud)

结果是在Unix中的13位数时间戳.

  • `timeIntervalSince1970`方法确实在整数的秒数处返回,但是它是一个'double`,它也包括小数秒,它可以被算术转换为毫秒.因此,乘以1000. (8认同)
  • 这不会返回实际的毫秒数,因为timeIntervalSince1970以秒为单位返回间隔,因此我们不会达到所需的毫秒精度. (4认同)
  • "很长"?这个郎真是太奇怪了 (2认同)

Eim*_*tas 10

NSTimeInterval milisecondedDate = ([[NSDate date] timeIntervalSince1970] * 1000);
Run Code Online (Sandbox Code Playgroud)


Sia*_*ter 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()
    }
}
Run Code Online (Sandbox Code Playgroud)


Jav*_*ava 7

你可以这样做:

long currentTime = (long)(NSTimeInterval)([[NSDate date] timeIntervalSince1970]);
Run Code Online (Sandbox Code Playgroud)

这将返回一个毫秒的值,所以如果你将结果值乘以1000(如我的Eimantas所示),你将溢出long类型,它将导致负值.

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

currentTime = 1357234941
Run Code Online (Sandbox Code Playgroud)

currentTime /seconds / minutes / hours / days = years
1357234941 / 60 / 60 / 24 / 365 = 43.037637652207
Run Code Online (Sandbox Code Playgroud)


Ita*_*ski 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;
Run Code Online (Sandbox Code Playgroud)

或(如果你需要一个字符串):

NSString *timestampString = [NSString stringWithFormat:@"%ld%d",digits ,decimalDigits];
Run Code Online (Sandbox Code Playgroud)


Ani*_*kur 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
Run Code Online (Sandbox Code Playgroud)

为了达到目标,CI 做了类似下面的事情来打印它 -

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

希望这有帮助。