主流编程语言如何获取系统当前本地时间
"获取当前时间"大概是每个程序员在每门新语言里都要写一遍的代码。 这篇文章把主流语言的标准写法整理成一份速查手册,全部使用各语言的现代推荐 API, 可以直接复制使用。
先来一个活的例子 —— 下面这块时间就是本页 JavaScript 实时获取的:
你的本地时间(每秒刷新)
1. JavaScript / TypeScript
Date 对象默认就是本地时区,这也是上面那个时钟的实现方式:
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
Pythonfrom 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 包,忘掉老的 Date 和 Calendar:
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:
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 这个事实标准:
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 终于原生支持时区了:
#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
Rubynow = Time.now # 本地时间
puts now # 2026-07-10 14:30:25 +0800
puts now.strftime("%Y-%m-%d %H:%M:%S")
11. Swift
Swiftimport 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
Kotlinimport 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)
Bashdate "+%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。
这份清单会随语言版本更新而维护,发现遗漏欢迎告诉我。
← 返回首页