学习笔记
1. 时间戳的定义
在 Java 中,时间戳通常表示自1970年1月1日00:00:00 UTC以来的毫秒数。Java 提供了多种方式来处理时间戳。
2. 获取当前时间戳
你可以使用 System.currentTimeMillis()
方法来获取当前的时间戳(以毫秒为单位)。
long timestampMillis = System.currentTimeMillis(); // 获取当前时间的毫秒时间戳
如果你需要以秒为单位,可以将其除以1000:
long timestampSeconds = timestampMillis / 1000; // 转换为秒
3. 使用 java.time
包(Java 8及以上)
Java 8 引入了新的日期时间 API,推荐使用 java.time
包来处理日期和时间。
获取当前时间戳
import java.time.Instant;
Instant now = Instant.now(); // 获取当前时间戳
long timestampMillis = now.toEpochMilli(); // 毫秒
long timestampSeconds = now.getEpochSecond(); // 秒
4. 转换时间戳为可读日期
你可以将时间戳转换为可读的日期格式,通常使用 java.text.SimpleDateFormat
或 java.time.format.DateTimeFormatter
。
使用 SimpleDateFormat
import java.text.SimpleDateFormat;
import java.util.Date;
long timestamp = System.currentTimeMillis();
Date date = new Date(timestamp);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String formattedDate = sdf.format(date);
System.out.println(formattedDate); // 打印可读的日期格式
使用 DateTimeFormatter
import java.time.Instant;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
long timestamp = System.currentTimeMillis();
Instant instant = Instant.ofEpochMilli(timestamp);
String formattedDate = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
.withZone(ZoneId.systemDefault())
.format(instant);
System.out.println(formattedDate); // 打印可读的日期格式
1. 使用 SimpleDateFormat
SimpleDateFormat
是用于格式化和解析日期的类。常用的格式化字符串包括:
- "yyyy-MM-dd": 年-月-日(例如:2024-10-26)
- "yyyy/MM/dd": 年/月/日(例如:2024/10/26)
- "dd-MM-yyyy": 日-月-年(例如:26-10-2024)
- "HH:mm": 时:分:秒(24小时制,例如:14:30:45)
- "hh:mma": 时:分:秒 AM/PM(12小时制,例如:02:30:45 PM)
- "yyyy-MM-dd HH:mm": 年-月-日 时:分:秒(例如:2024-10-26 14:30:45)
- "yyyy/MM/dd HH:mm": 年/月/日 时:分:秒
import java.text.SimpleDateFormat;
import java.util.Date;
long timestamp = System.currentTimeMillis();
Date date = new Date(timestamp);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String formattedDate = sdf.format(date);
System.out.println(formattedDate); // 输出:2024-10-26 14:30:45
2. 使用 DateTimeFormatter
从 Java 8 开始,引入了新的日期时间 API,使用 DateTimeFormatter
更加灵活和强大。
常用的格式包括:
- "yyyy-MM-dd"
- "yyyy/MM/dd"
- "dd-MM-yyyy"
- "HH:mm"
- "hh:mma"
- "yyyy-MM-dd HH:mm"
- "yyyy/MM/dd HH:mm"
- "yyyy-MM-dd'T'HH:mm.SSS'Z'": ISO 8601 格式(例如:2024-10-26T14:30:45.123Z)
import java.time.Instant;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
long timestamp = System.currentTimeMillis();
Instant instant = Instant.ofEpochMilli(timestamp);
String formattedDate = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
.withZone(ZoneId.systemDefault())
.format(instant);
System.out.println(formattedDate); // 输出:2024-10-26 14:30:45
3. 自定义格式
你可以根据需要自定义日期格式,以下是一些常用符号及其含义:
- y: 年
- M: 月(1-12或01-12)
- d: 日(1-31)
- H: 小时(0-23)
- h: 小时(1-12)
- m: 分钟(0-59)
- s: 秒(0-59)
- a: AM/PM标识
5. 实际应用示例
1. 日志记录
在应用程序中记录事件的发生时间。
public void logEvent(String event) {
long timestamp = System.currentTimeMillis();
System.out.println("Event: " + event + " at " + timestamp);
}
2. 计算时间差
测量某个操作执行的时间。
public void measureOperationTime() {
long startTime = System.currentTimeMillis();
// 执行某个操作
performOperation();
long endTime = System.currentTimeMillis();
long duration = endTime - startTime;
System.out.println("Operation took " + duration + " milliseconds.");
}
private void performOperation() {
// 模拟操作
try {
Thread.sleep(200); // 暂停200毫秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
3. 定时任务
使用时间戳来设置定时任务。
import java.util.Timer;
import java.util.TimerTask;
public class ScheduledTask {
public void scheduleTask(long delay) {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("Task executed at: " + System.currentTimeMillis());
}
}, delay); // 延迟执行
}
}
6. 注意事项
- 时区:处理时间戳时,通常使用 UTC。在将其转换为可读格式时,请注意时区问题。
- 精度:根据需求选择合适的时间戳精度(毫秒或秒)。
- 线程安全:在多线程环境中处理时间戳时,需要确保线程安全,特别是在记录日志时。