主流编程语言如何获取系统当前本地时间

"获取当前时间"大概是每个程序员在每门新语言里都要写一遍的代码。 这篇文章把主流语言的标准写法整理成一份速查手册,全部使用各语言的现代推荐 API, 可以直接复制使用。

先来一个活的例子 —— 下面这块时间就是本页 JavaScript 实时获取的:

你的本地时间(每秒刷新)

1. JavaScript / TypeScript

Date 对象默认就是本地时区,这也是上面那个时钟的实现方式:

JavaScript
const now = new Date();

console.log(now.toLocaleString());        // 2026/7/10 14:30:25
console.log(now.getFullYear());           // 2026
console.log(now.getHours(), now.getMinutes(), now.getSeconds());

// 更精细的格式化用 Intl.DateTimeFormat
const fmt = new Intl.DateTimeFormat("zh-CN", {
  dateStyle: "full",
  timeStyle: "medium",
});
console.log(fmt.format(now)); // 2026年7月10日星期五 14:30:25

2. Python

Python
from datetime import datetime

now = datetime.now()                       # 本地时间
print(now)                                 # 2026-07-10 14:30:25.123456
print(now.strftime("%Y-%m-%d %H:%M:%S"))   # 2026-07-10 14:30:25

# Python 3.9+ 推荐带上时区信息(zoneinfo 标准库)
from zoneinfo import ZoneInfo
aware = datetime.now(ZoneInfo("Asia/Shanghai"))
print(aware.isoformat())                   # 2026-07-10T14:30:25+08:00

3. Java

Java 8 之后请使用 java.time 包,忘掉老的 DateCalendar:

Java
import java.time.LocalDateTime;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

LocalDateTime now = LocalDateTime.now();   // 本地时间,不带时区
System.out.println(now);                   // 2026-07-10T14:30:25.123

ZonedDateTime zoned = ZonedDateTime.now(); // 带系统默认时区
System.out.println(zoned);                 // 2026-07-10T14:30:25+08:00[Asia/Shanghai]

DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println(now.format(fmt));       // 2026-07-10 14:30:25

4. Go

Go 的格式化模板是那个著名的参考时间 2006-01-02 15:04:05:

Go
package main

import (
    "fmt"
    "time"
)

func main() {
    now := time.Now() // 本地时间,自带时区
    fmt.Println(now)                              // 2026-07-10 14:30:25.123 +0800 CST
    fmt.Println(now.Format("2006-01-02 15:04:05")) // 2026-07-10 14:30:25
    fmt.Println(now.Year(), now.Month(), now.Day())
}

5. Rust

标准库只有 SystemTime(时间戳),日常开发用 chrono 这个事实标准:

Rust
use chrono::Local;

fn main() {
    let now = Local::now(); // 本地时间
    println!("{}", now);                            // 2026-07-10 14:30:25.123 +08:00
    println!("{}", now.format("%Y-%m-%d %H:%M:%S")); // 2026-07-10 14:30:25
}

6. C

C
#include <stdio.h>
#include <time.h>

int main(void) {
    time_t t = time(NULL);
    struct tm local;
    localtime_r(&t, &local);   // 线程安全版本;Windows 上用 localtime_s

    char buf[64];
    strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", &local);
    printf("%s\n", buf);        // 2026-07-10 14:30:25
    return 0;
}

7. C++

C++20 的 std::chrono 终于原生支持时区了:

C++20
#include <chrono>
#include <iostream>

int main() {
    auto now = std::chrono::system_clock::now();
    auto local = std::chrono::zoned_time{
        std::chrono::current_zone(), now};
    std::cout << std::format("{:%Y-%m-%d %H:%M:%S}", local) << '\n';
    // 编译器还不支持 C++20 时区库的话,退回上面的 C 写法即可
}

8. C#

C#
DateTime now = DateTime.Now;                 // 本地时间
Console.WriteLine(now);                      // 2026/7/10 14:30:25
Console.WriteLine(now.ToString("yyyy-MM-dd HH:mm:ss"));

// .NET 6+ 只关心"时间点"还是"日期"时,可用更精确的类型
TimeOnly time = TimeOnly.FromDateTime(now);
DateOnly date = DateOnly.FromDateTime(now);

9. PHP

PHP
<?php
// 建议先在 php.ini 或代码里设定时区
date_default_timezone_set('Asia/Shanghai');

echo date('Y-m-d H:i:s');          // 2026-07-10 14:30:25

// 面向对象风格
$now = new DateTime();
echo $now->format('Y-m-d H:i:s');

10. Ruby

Ruby
now = Time.now                      # 本地时间
puts now                            # 2026-07-10 14:30:25 +0800
puts now.strftime("%Y-%m-%d %H:%M:%S")

11. Swift

Swift
import Foundation

let now = Date()                    // 时间点本身没有时区
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
formatter.timeZone = .current       // 按系统本地时区格式化
print(formatter.string(from: now)) // 2026-07-10 14:30:25

12. Kotlin

Kotlin
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter

fun main() {
    val now = LocalDateTime.now()
    println(now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")))
}

13. Shell(Bash)

Bash
date "+%Y-%m-%d %H:%M:%S"    # 2026-07-10 14:30:25

14. SQL

SQL
-- MySQL
SELECT NOW();

-- PostgreSQL
SELECT LOCALTIMESTAMP;   -- 本地时间,不带时区
SELECT NOW();            -- 带时区

-- SQLite
SELECT datetime('now', 'localtime');

几个容易踩的坑

  • "本地时间"取决于运行环境的时区设置。服务器常配置为 UTC,和你开发机上的结果不一样 —— 存储用 UTC,展示才转本地,是最不容易出错的原则。
  • 区分"时间点"和"墙上时间"。Date(JS)、Instant(Java)、Date(Swift)本质是 UTC 时间戳,"本地"只发生在格式化那一步。
  • 优先选带时区信息的类型(Python 的 aware datetime、Java 的 ZonedDateTime),跨时区的 bug 大多来自 naive 时间。
  • C 语言注意线程安全:localtime() 返回静态缓冲区,多线程下要用 localtime_r / localtime_s

这份清单会随语言版本更新而维护,发现遗漏欢迎告诉我。

← 返回首页