编程语言时间戳对比
流行编程语言的时间戳操作快速参考。
获取当前时间戳
| 语言 | 秒 | 毫秒 | 微秒 |
|---|---|---|---|
| JavaScript | Math.floor(Date.now() / 1000) | Date.now() | performance.now() |
| Python | int(time.time()) | int(time.time() * 1000) | time.time_ns() // 1000 |
| Java | System.currentTimeMillis() / 1000 | System.currentTimeMillis() | Instant.now().getEpochSecond() |
| Go | time.Now().Unix() | time.Now().UnixMilli() | time.Now().UnixMicro() |
| PHP | time() | microtime(true) * 1000 | microtime(true) * 1000000 |
| Ruby | Time.now.to_i | Time.now.to_f * 1000 | Time.now.to_r |
| C# | DateTimeOffset.UtcNow.ToUnixTimeSeconds() | DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() | - |
| Swift | Date().timeIntervalSince1970 | Int(Date().timeIntervalSince1970 * 1000) | - |
时间戳转日期
| 语言 | 代码 |
|---|---|
| JavaScript | new Date(timestamp * 1000) |
| Python | datetime.fromtimestamp(timestamp) |
| Java | Instant.ofEpochSecond(timestamp) |
| Go | time.Unix(timestamp, 0) |
| PHP | date('Y-m-d H:i:s', $timestamp) |
| Ruby | Time.at(timestamp) |
| C# | DateTimeOffset.FromUnixTimeSeconds(timestamp) |
| Swift | Date(timeIntervalSince1970: TimeInterval(timestamp)) |
日期转时间戳
| 语言 | 代码 |
|---|---|
| JavaScript | Math.floor(date.getTime() / 1000) |
| Python | int(date.timestamp()) |
| Java | date.toEpochSecond(ZoneOffset.UTC) |
| Go | date.Unix() |
| PHP | strtotime('2024-01-01') |
| Ruby | date.to_i |
| C# | ((DateTimeOffset)date).ToUnixTimeSeconds() |
| Swift | Int(date.timeIntervalSince1970) |
格式化
| 语言 | 代码 |
|---|---|
| JavaScript | date.toISOString() 或 date.toLocaleString() |
| Python | date.strftime('%Y-%m-%d %H:%M:%S') |
| Java | DateTimeFormatter.ISO_DATE_TIME.format(date) |
| Go | date.Format(time.RFC3339) |
| PHP | date('Y-m-d H:i:s', $timestamp) |
| Ruby | date.strftime('%Y-%m-%d %H:%M:%S') |
| C# | date.ToString("yyyy-MM-dd HH:mm:ss") |
| Swift | dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss" |
时区处理
| 语言 | UTC | 本地时间 | 转换 |
|---|---|---|---|
| JavaScript | new Date().toISOString() | new Date().toLocaleString() | date.toLocaleString('en-US', {timeZone: 'UTC'}) |
| Python | datetime.utcnow() | datetime.now() | date.astimezone(timezone('UTC')) |
| Java | Instant.now() | LocalDateTime.now() | date.atZone(ZoneId.of("UTC")) |
| Go | time.Now().UTC() | time.Now() | date.In(time.UTC) |
| PHP | gmdate() | date() | date_default_timezone_set('UTC') |
| Ruby | Time.now.utc | Time.now | Time.now.getutc |
| C# | DateTime.UtcNow | DateTime.Now | TimeZoneInfo.ConvertTimeToUtc(date) |
| Swift | Date() (内部始终UTC) | Date() | Calendar.current.dateComponents |
主要差异
纪元起点
- 所有语言使用 Unix纪元:1970年1月1日 00:00:00 UTC
- 例外:GPS时间 使用1980年1月6日
- TAI 使用1958年1月1日
精度
- 秒:最常见,10位数字(直到2286年)
- 毫秒:13位数字,JavaScript默认
- 微秒:16位数字
- 纳秒:19位数字,某些系统使用
时区存储
- JavaScript:Date对象无时区,使用浏览器时区
- Python:Naive vs Aware datetime对象
- Java:Instant (UTC) vs ZonedDateTime (带时区)
- Go:Location附加到Time对象
- Ruby:Time对象包含时区偏移
- C#:DateTimeKind (Unspecified, Utc, Local)
- Swift:Date始终UTC,Calendar处理时区
最佳实践
- 数据库中始终存储UTC时间
- 仅在显示时转换为本地时间
- API序列化使用ISO 8601格式
- 小心处理闰秒(GPS/TAI vs UTC)
- 根据用例考虑所需精度