【Java中时间大全】

Java 时间类型介绍与转换指南

Java 提供了多种时间处理类,主要分为两类:

  1. 传统日期时间类java.util包)
  2. 现代日期时间APIjava.time包,Java 8+推荐使用)

一、主要时间类型
  1. java.util.Date

    • 表示特定的时间点(精确到毫秒)
    • 缺点:时区处理不便,API设计过时
  2. java.util.Calendar

    • 提供日期计算功能
    • 缺点:月份从0开始(0=1月),线程不安全
  3. java.time.LocalDate(Java 8+)

    • 仅包含日期(年-月-日)
    • 示例:2023-10-15
  4. java.time.LocalTime(Java 8+)

    • 仅包含时间(时:分:秒)
    • 示例:14:30:45
  5. java.time.LocalDateTime(Java 8+)

    • 包含日期和时间
    • 示例:2023-10-15T14:30:45
  6. java.time.ZonedDateTime(Java 8+)

    • 带时区的完整日期时间
    • 示例:2023-10-15T14:30:45+08:00[Asia/Shanghai]
  7. java.time.Instant(Java 8+)

    • 时间戳(UTC时区)
    • 示例:2023-10-15T06:30:45Z

二、类型转换代码示例
import java.time.*;
import java.util.*;

public class TimeConversionDemo {
    public static void main(String[] args) {
        // 1. 传统类型互转
        Date utilDate = new Date();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(utilDate);  // Date → Calendar
        
        // 2. 现代API互转
        LocalDate date = LocalDate.now();
        LocalTime time = LocalTime.now();
        LocalDateTime dateTime = LocalDateTime.of(date, time);  // LocalDate+LocalTime → LocalDateTime
        
        // 3. 传统 → 现代 (Java 8+)
        Instant instant = utilDate.toInstant();  // Date → Instant
        ZonedDateTime zonedDT = ZonedDateTime.ofInstant(instant, ZoneId.systemDefault());
        
        // 4. 现代 → 传统
        Date newDate = Date.from(instant);  // Instant → Date
        
        // 5. 带时区转换
        ZonedDateTime londonTime = ZonedDateTime.now(ZoneId.of("Europe/London"));
        LocalDateTime localDT = londonTime.toLocalDateTime();  // 时区时间 → 本地时间
        
        // 6. 字符串解析
        LocalDateTime parsedDT = LocalDateTime.parse("2023-12-25T08:30:00");
        
        // 7. 格式化输出
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm");
        String formatted = dateTime.format(formatter);  // 输出示例: 2023/10/15 14:30
    }
}

三、转换关系图
toInstant
atZone
toLocalDateTime
toLocalDate
toLocalTime
combine
combine
toInstant
from
Date
Instant
ZonedDateTime
LocalDateTime
LocalDate
LocalTime

四、最佳实践建议
  1. 优先使用java.time(Java 8+)
  2. 时区处理:
    // 明确指定时区
    ZonedDateTime zdt = ZonedDateTime.now(ZoneId.of("GMT+8"));
    
  3. 时间差计算:
    Duration duration = Duration.between(startTime, endTime);
    long minutes = duration.toMinutes();
    
  4. 日期运算:
    LocalDate nextWeek = LocalDate.now().plusDays(7);
    

五、注意事项
  1. SimpleDateFormat线程不安全,推荐使用DateTimeFormatter
  2. 避免混用新旧API,必要转换时使用Instant作为桥梁
  3. 数据库交互:
    • JDBC 4.2+ 支持直接使用java.time类型
    • 旧驱动需转换:
      Timestamp timestamp = Timestamp.valueOf(localDateTime);
      
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值