订单号要拼时间、接口要做防重放校验、日志要记发生时刻,这些都离不开时间戳。java获取当前时间戳最常用的就一行:

long ts = System.currentTimeMillis();  System.out.println(ts);   // 13位数字,如 1730000000000

这个方法返回 Unix 时间戳,精确到毫秒,从 1970 年 1 月 1 日 0 点 UTC 起算。它读的是系统时钟,不依赖时区设置,跨时区的服务器之间对账用它最稳。老的 Date 类和 Calendar 类虽然也能取,不少方法标记了过时,新代码不建议再绕过去。

其他几种等价写法

long a = new java.util.Date().getTime();   // 老写法   long b = Instant.now().toEpochMilli();   // Java 8 起   long c = Timestamp.valueOf(LocalDateTime.now()).getTime();   // 配数据库字段

三种结果基本一致。如果面试被问到 java获取当前时间戳有几种写法,答出这三个加秒级换算就够了。日常推荐 System.currentTimeMillis,最直接也没有对象创建的开销;已经全面用 Java 8 时间 API 的项目统一走 Instant,风格一致更好维护。

秒级时间戳和格式化

不少老接口只要 10 位秒级时间戳,毫秒值除以 1000 就行:

long seconds = System.currentTimeMillis() / 1000;

要转成 2026-10-31 12:00:00 这种可读格式,配合 SimpleDateFormat 或 Java 8 的 DateTimeFormatter。pattern 里写 yyyy-MM-dd HH:mm:ss,注意 HH 是 24 小时制,小写的 hh 是 12 小时制,下午的时间会差 12 个小时,这个坑比想象中常见。

最后提醒:时间戳本身没有时区概念,格式化出来的字符串才有。分布式环境下不要拿各台机器格式化后的时间做排序,直接比时间戳,误差最小。