Java 的时间 API 是一个非常重要的主题,尤其是 Java 8 引入的 java.time 包,它为日期和时间处理提供了强大的功能。
我们可以按照以下几个主题逐步学习 Java 时间处理:
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
public class DateFormatting {
public static void main(String[] args) {
// 当前日期、时间、日期时间
LocalDate date = LocalDate.now();
LocalTime time = LocalTime.now();
LocalDateTime dateTime = LocalDateTime.now();
// 定义格式化器
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss");
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// 格式化
String formattedDate = date.format(dateFormatter);
String formattedTime = time.format(timeFormatter);
String formattedDateTime = dateTime.format(dateTimeFormatter);
System.out.println("格式化日期: " + formattedDate);
System.out.println("格式化时间: " + formattedTime);
System.out.println("格式化日期时间: " + formattedDateTime);
}
}
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
public class DateParsing {
public static void main(String[] args) {
// 字符串
String dateString = "2024-12-09";
String timeString = "14:25:30";
String dateTimeString = "2024-12-09 14:25:30";
// 定义解析器(格式需与字符串匹配)
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss");
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// 解析
LocalDate parsedDate = LocalDate.parse(dateString, dateFormatter);
LocalTime parsedTime = LocalTime.parse(timeString, timeFormatter);
LocalDateTime parsedDateTime = LocalDateTime.parse(dateTimeString, dateTimeFormatter);
System.out.println("解析日期: " + parsedDate);
System.out.println("解析时间: " + parsedTime);
System.out.println("解析日期时间: " + parsedDateTime);
}
}
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class BuiltInFormatters {
public static void main(String[] args) {
// 当前日期时间
LocalDateTime now = LocalDateTime.now();
// 使用内置格式化器
String isoDateTime = now.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
System.out.println("ISO格式日期时间: " + isoDateTime);
// 使用内置解析器
LocalDateTime parsedDateTime = LocalDateTime.parse("2024-12-09T14:25:30",
DateTimeFormatter.ISO_LOCAL_DATE_TIME);
System.out.println("解析的日期时间: " + parsedDateTime);
}
}
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.LocalDateTime;
public class DateTimeCalculation {
public static void main(String[] args) {
// 当前日期和时间
LocalDate date = LocalDate.now();
LocalTime time = LocalTime.now();
LocalDateTime dateTime = LocalDateTime.now();
// 日期加减
LocalDate plusDays = date.plusDays(5); // 加5天
LocalDate minusMonths = date.minusMonths(2); // 减2个月
// 时间加减
LocalTime plusHours = time.plusHours(3); // 加3小时
LocalTime minusMinutes = time.minusMinutes(15); // 减15分钟
// 日期时间加减
LocalDateTime plusWeeks = dateTime.plusWeeks(1); // 加1周
LocalDateTime minusYears = dateTime.minusYears(1); // 减1年
System.out.println("当前日期: " + date);
System.out.println("加5天: " + plusDays);
System.out.println("减2个月: " + minusMonths);
System.out.println("当前时间: " + time);
System.out.println("加3小时: " + plusHours);
System.out.println("减15分钟: " + minusMinutes);
System.out.println("当前日期时间: " + dateTime);
System.out.println("加1周: " + plusWeeks);
System.out.println("减1年: " + minusYears);
}
}
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.Duration;
import java.time.Period;
public class IntervalCalculation {
public static void main(String[] args) {
// 日期间隔
LocalDate startDate = LocalDate.of(2024, 12, 1);
LocalDate endDate = LocalDate.of(2024, 12, 9);
Period period = Period.between(startDate, endDate);
System.out.println("日期间隔: " + period.getDays() + " 天");
// 时间间隔
LocalDateTime startTime = LocalDateTime.of(2024, 12, 9, 10, 0, 0);
LocalDateTime endTime = LocalDateTime.of(2024, 12, 9, 14, 30, 0);
Duration duration = Duration.between(startTime, endTime);
System.out.println("时间间隔: " + duration.toHours() + " 小时 " + duration.toMinutesPart() + " 分钟");
}
}
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class InternationalDateFormatting {
public static void main(String[] args) {
LocalDateTime now = LocalDateTime.now();
// 英文格式
DateTimeFormatter formatterUS = DateTimeFormatter.ofPattern("EEEE, MMMM d, yyyy", Locale.US);
System.out.println("美国格式: " + now.format(formatterUS));
// 中文格式
DateTimeFormatter formatterCN = DateTimeFormatter.ofPattern("yyyy年MM月dd日 EEEE", Locale.CHINA);
System.out.println("中国格式: " + now.format(formatterCN));
}
}
import java.time.LocalDate;
public class ActiveUserAnalysis {
public static void main(String[] args) {
LocalDate today = LocalDate.now();
LocalDate oneWeekAgo = today.minusDays(7);
System.out.println("统计范围起始日期: " + oneWeekAgo);
System.out.println("统计范围结束日期: " + today);
// 示例 SQL 查询
String sqlQuery = String.format("SELECT * FROM users WHERE last_active BETWEEN '%s' AND '%s';",
oneWeekAgo, today);
System.out.println("生成的 SQL 查询: " + sqlQuery);
}
}
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class DateParsingAndFormatting {
public static void main(String[] args) {
String input = "20241209153000"; // 输入格式为 yyyyMMddHHmmss
// 解析输入字符串
DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
LocalDateTime dateTime = LocalDateTime.parse(input, inputFormatter);
// 格式化为目标格式
DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formattedDate = dateTime.format(outputFormatter);
System.out.println("原始字符串: " + input);
System.out.println("解析后的时间: " + dateTime);
System.out.println("格式化后的时间: " + formattedDate);
}
}
import java.time.LocalDateTime;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class TimerExample {
public static void main(String[] args) {
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
// 开始时间
LocalDateTime startTime = LocalDateTime.now();
// 定时任务
scheduler.scheduleAtFixedRate(() -> {
LocalDateTime now = LocalDateTime.now();
System.out.println("当前时间: " + now);
// 检查是否运行满 1 分钟
if (now.isAfter(startTime.plusMinutes(1))) {
System.out.println("定时任务结束");
scheduler.shutdown();
}
}, 0, 10, TimeUnit.SECONDS);
}
}
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class DateTimeUtils {
// 常用日期时间格式
public static final String DEFAULT_FORMAT = "yyyy-MM-dd HH:mm:ss";
public static final String DATE_FORMAT = "yyyy-MM-dd";
public static final String TIME_FORMAT = "HH:mm:ss";
private DateTimeUtils() {
// 私有构造方法防止实例化
}
/**
* 获取当前时间字符串
* @return 当前时间,格式为 yyyy-MM-dd HH:mm:ss
*/
public static String getCurrentTime() {
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(DEFAULT_FORMAT));
}
/**
* 按指定格式获取当前时间字符串
* @param format 日期格式
* @return 当前时间
*/
public static String getCurrentTime(String format) {
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(format));
}
/**
* 解析字符串为 LocalDateTime
* @param dateStr 日期字符串
* @param format 日期格式
* @return LocalDateTime 对象
*/
public static LocalDateTime parse(String dateStr, String format) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
return LocalDateTime.parse(dateStr, formatter);
}
/**
* 格式化 LocalDateTime 为字符串
* @param dateTime LocalDateTime 对象
* @param format 日期格式
* @return 格式化后的字符串
*/
public static String format(LocalDateTime dateTime, String format) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
return dateTime.format(formatter);
}
/**
* 计算两个日期之间的天数
* @param start 开始日期
* @param end 结束日期
* @return 天数
*/
public static long daysBetween(LocalDate start, LocalDate end) {
return Duration.between(start.atStartOfDay(), end.atStartOfDay()).toDays();
}
/**
* 获取指定时间加上指定天数后的时间
* @param dateTime 原时间
* @param days 增加的天数
* @return 新时间
*/
public static LocalDateTime addDays(LocalDateTime dateTime, int days) {
return dateTime.plusDays(days);
}
/**
* 转换时间为目标时区
* @param dateTime LocalDateTime 对象
* @param sourceZoneId 源时区
* @param targetZoneId 目标时区
* @return 转换后的 ZonedDateTime
*/
public static ZonedDateTime convertZone(LocalDateTime dateTime, String sourceZoneId, String targetZoneId) {
ZoneId sourceZone = ZoneId.of(sourceZoneId);
ZoneId targetZone = ZoneId.of(targetZoneId);
ZonedDateTime zonedDateTime = dateTime.atZone(sourceZone);
return zonedDateTime.withZoneSameInstant(targetZone);
}
/**
* 获取当前时间戳(秒)
* @return 时间戳
*/
public static long getCurrentTimestamp() {
return Instant.now().getEpochSecond();
}
/**
* 将时间戳转换为 LocalDateTime
* @param timestamp 时间戳(秒)
* @return LocalDateTime 对象
*/
public static LocalDateTime timestampToLocalDateTime(long timestamp) {
return LocalDateTime.ofInstant(Instant.ofEpochSecond(timestamp), ZoneId.systemDefault());
}
}
public class DateTimeUtilsTest {
public static void main(String[] args) {
// 获取当前时间
System.out.println("当前时间: " + DateTimeUtils.getCurrentTime());
// 自定义格式化当前时间
System.out.println("当前时间(自定义格式): " + DateTimeUtils.getCurrentTime("yyyy/MM/dd HH:mm"));
// 解析时间字符串
String dateStr = "2024-12-09 10:30:00";
LocalDateTime parsedTime = DateTimeUtils.parse(dateStr, "yyyy-MM-dd HH:mm:ss");
System.out.println("解析时间: " + parsedTime);
// 格式化 LocalDateTime
String formattedTime = DateTimeUtils.format(parsedTime, "MM/dd/yyyy HH:mm");
System.out.println("格式化时间: " + formattedTime);
// 计算日期差
LocalDate startDate = LocalDate.of(2024, 12, 1);
LocalDate endDate = LocalDate.of(2024, 12, 9);
System.out.println("日期差: " + DateTimeUtils.daysBetween(startDate, endDate) + " 天");
// 时间加减
LocalDateTime now = LocalDateTime.now();
LocalDateTime newTime = DateTimeUtils.addDays(now, 5);
System.out.println("当前时间加 5 天: " + newTime);
// 时区转换
LocalDateTime utcNow = LocalDateTime.now(ZoneId.of("UTC"));
ZonedDateTime nyTime = DateTimeUtils.convertZone(utcNow, "UTC", "America/New_York");
System.out.println("UTC 转纽约时间: " + nyTime);
// 获取当前时间戳
long timestamp = DateTimeUtils.getCurrentTimestamp();
System.out.println("当前时间戳: " + timestamp);
// 时间戳转 LocalDateTime
LocalDateTime fromTimestamp = DateTimeUtils.timestampToLocalDateTime(timestamp);
System.out.println("时间戳转时间: " + fromTimestamp);
}
}