摘要: 本文用最通俗的语言和生活中的例子,向编程初学者解释什么是时间戳,以及如何在编程中(以Python为例)将时间戳转换为人类能看懂的日期时间格式。其实我前面写过一篇但是我发现看的人还挺多的所以更新一下,没办法干这行的就是的一直学还是一直学新东西才能保住饭碗。
关键词: 使用Python、JavaScript、Java、Go、SQL、PHP、c++等语言将看不懂的时间戳转换为看得懂的日期时间格式。 编程入门 时间处理
一、开头:从一个“无聊”的数字说起
大家好!我是刚学编程不久的小白。今天在代码里看到一个奇怪的东西:1717824123。前辈告诉我这是一个“时间戳”(Timestamp)。
我当时的反应是:“啥?这一串数字是时间?这谁能看懂啊!”
相信很多刚开始接触编程的朋友都有过类似的困惑。别急,今天我们就用大白话,把“时间戳”这个看似高深的概念彻底搞明白!
二、时间戳到底是什么?(超市小票版解释)
一句话概括:时间戳就是计算机记录的“一个事件发生的具体时刻”。
为了让你秒懂,我们举个生活中的例子:
想象一下,你在超市购物,收银员给你打了一张小票。小票上有一个重要的信息:交易时间,比如
2024-06-08 15:22:03。对于你和我来说,这个日期时间格式一看就懂。但对于超市的电脑系统来说,它可能同时在处理成千上万张小票,为了计算和存储的方便,它内部可能用一个更简单的方式记录时间——比如,从某个“起点”开始,到现在一共过去了多少秒。
这个“从起点开始过去的秒数”,就是时间戳!
所以:
-
人类喜欢看:
2024-06-08 15:22:03 -
计算机喜欢用:
1717824123(这就是上面那个时间对应的时间戳)
那么这个“起点”是哪天呢?
在计算机世界里,这个公认的起点是 1970年1月1日 00:00:00 UTC(可以理解为“计算机世界的创世纪元年”)。时间戳 1717824123 就表示从1970年1月1日到现在,一共过去了这么多秒。
为什么要用时间戳?
-
全球统一:无论你在哪个时区,时间戳的数值都是一样的,避免了时区混乱。
-
计算方便:计算机非常擅长处理数字。计算两个事件之间隔了多久?直接时间戳相减就行!
-
存储简单:用一个整数就能表示一个精确的时刻,比存一串字符省事多了。
三、实战:如何把时间戳“变回”我们能看懂的样子?(Python版)
理论说完了,我们来点实际的。在Python中,转换时间戳超级简单,主要用到一个叫 datetime 的库。
| 程语言 | 获取当前时间戳 | 时间戳 → 日期时间 (关键方法) |
|---|---|---|
| Python |
import timetime.time() |
datetime.datetime.fromtimestamp(timestamp) |
| JavaScript |
Math.round(new Date().getTime()/1000) |
new Date(timestamp * 1000) |
| Java |
long timestamp = System.currentTimeMillis() / 1000; (此方法需注意单位) |
Instant.ofEpochSecond(timestamp).atZone(ZoneId.systemDefault()) |
| Go |
time.Now().Unix() |
time.Unix(timestamp, 0) |
| PHP |
time() |
date('Y-m-d H:i:s', timestamp) |
| C# | 请参考下方详解 |
DateTimeOffset.FromUnixTimeSeconds(timestamp).LocalDateTime |
| C |
localtime(×tamp) |
🐍 Python
Python中转换时间戳非常灵活,主要有两种方式:
-
使用
datetime模块(推荐):python import datetime timestamp = 1736502400 # 转换为本地时间的 datetime 对象 dt_object = datetime.datetime.fromtimestamp(timestamp) # 格式化为字符串 formatted_time = dt_object.strftime('%Y-%m-%d %H:%M:%S') print(formatted_time) # 输出:2025-01-10 12:00:00 -
使用
time模块:python
import time timestamp = 1736502400 # 转换为本地时间的 struct_time 对象 time_tuple = time.localtime(timestamp) # 格式化为字符串 formatted_time = time.strftime('%Y-%m-%d %H:%M:%S', time_tuple) print(formatted_time) # 输出:2025-01-10 12:00:00
💻 JavaScript / TypeScript
在JavaScript中,处理时间戳需要注意单位是毫秒。
javascript
// 假设有一个秒级时间戳
let timestamp = 1736502400;
// 1. 转换为 Date 对象 (需要乘以1000转换为毫秒)
let date = new Date(timestamp * 1000);
// 2. 转换为本地日期时间字符串
let localString = date.toLocaleString(); // 输出取决于区域设置,例如:"2025/1/10 12:00:00"
console.log(localString);
// 3. 或者手动拼接获取标准格式
let isoString = date.getFullYear() + '-' +
String(date.getMonth() + 1).padStart(2, '0') + '-' +
String(date.getDate()).padStart(2, '0') + ' ' +
String(date.getHours()).padStart(2, '0') + ':' +
String(date.getMinutes()).padStart(2, '0') + ':' +
String(date.getSeconds()).padStart(2, '0');
console.log(isoString); // 输出:"2025-01-10 12:00:00"
☕ Java
自Java 8起,推荐的日期时间API在java.time包下。
java
import java.time.Instant;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
public class TimestampConverter {
public static void main(String[] args) {
long timestamp = 1736502400L;
// 1. 将秒级时间戳转换为 Instant 对象
Instant instant = Instant.ofEpochSecond(timestamp);
// 2. 转换为系统默认时区的日期时间
ZonedDateTime localDateTime = instant.atZone(ZoneId.systemDefault());
// 3. 格式化输出
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formattedTime = localDateTime.format(formatter);
System.out.println(formattedTime); // 输出:2025-01-10 12:00:00
}
}
🚀 Go
Go语言使用time包,其日期格式化模板比较特殊("2006-01-02 15:04:05")。
go
package main
import (
"fmt"
"time"
)
func main() {
timestamp := int64(1736502400)
// 1. 将秒级时间戳转换为 Time 对象
t := time.Unix(timestamp, 0)
// 2. 格式化为字符串 (使用Go的特定布局时间)
formattedTime := t.Format("2006-01-02 15:04:05")
fmt.Println(formattedTime) // 输出:2025-01-10 12:00:00
}
🌐 PHP
php
<?php
$timestamp = 1736502400;
// 1. 使用 date 函数直接格式化
$formattedTime = date('Y-m-d H:i:s', $timestamp);
echo $formattedTime; // 输出:2025-01-10 12:00:00
// 2. 或者使用 DateTime 类 (面向对象方式)
$dateTime = (new DateTime())->setTimestamp($timestamp);
echo $dateTime->format('Y-m-d H:i:s'); // 输出:2025-01-10 12:00:00
?>
🔧 C#
在C#中,.***提供了便捷的方法处理Unix时间戳。
csharp
using System;
public class Program
{
public static void Main()
{
long timestamp = 1736502400;
// 1. 将秒级时间戳转换为 DateTimeOffset (推荐,明确处理时区)
DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeSeconds(timestamp);
// 2. 转换为本地时间
DateTime localDateTime = dateTimeOffset.LocalDateTime;
// 3. 格式化输出
string formattedTime = localDateTime.ToString("yyyy-MM-dd HH:mm:ss");
Console.WriteLine(formattedTime); // 输出:2025-01-10 12:00:00
}
}
⚙️ C
C语言使用time.h库进行转换。
c
#include <stdio.h>
#include <time.h>
int main() {
time_t timestamp = 1736502400;
// 1. 将时间戳转换为本地时间的 tm 结构
struct tm *timeinfo = localtime(×tamp);
// 2. 使用 strftime 格式化输出
char buffer[80];
strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", timeinfo);
printf("%s\n", buffer); // 输出:2025-01-10 12:00:00
return 0;
}
🗃️ SQL
在数据库查询中直接转换时间戳也很常见。
-
MySQL:
sql
SELECT FROM_UNIXTIME(1736502400, '%Y-%m-%d %H:%i:%s') AS formatted_time; -
PostgreSQL:
sql
SELECT TO_TIMESTAMP(1736502400)::TIMESTAMP AS formatted_time; -- 或者格式化输出 SELECT TO_CHAR(TO_TIMESTAMP(1736502400), 'YYYY-MM-DD HH24:MI:SS') AS formatted_time; -
SQL Server:
sql
SELECT DATEADD(SECOND, 1736502400, '1970-01-01 00:00:00') AS formatted_time;
💡 核心概念与注意事项
-
时间戳精度:最常见的是秒级时间戳(10位数字),如
1736502400。JavaScript使用毫秒级(13位数字),处理时要注意区分,通常秒级时间戳需要乘以1000转换为毫秒。 -
时区问题:上述代码示例大多将时间戳转换为本地时间(操作系统设置的时区)。如果需要协调世界时(UTC),在Python中可使用
datetime.datetime.utcfromtimestamp(),在Java中可使用instant.atZone(ZoneId.of("UTC"))。 -
格式化符号:不同语言的格式化占位符有所不同,使用时需注意查阅文档。
觉得有用的话,别忘了点赞、收藏+关注哦!
你在学习编程的路上还会遇到各种问题?欢迎在评论区留言,我们一起交流讨论!
加油默默努力的你。