Java中的时间类型介绍及使用场景
1. Date 类
介绍
Date是Java最早的日期时间类,位于java.util包中。虽然功能相对简单,但在很多遗留系统中仍在广泛使用。
使用场景
- 与旧版本Java代码兼容
- 简单的时间戳操作
- 第三方库的时间参数传递
代码示例
importjava.util.Date;importjava.text.SimpleDateFormat;// 创建和赋值DatecurrentDate=newDate();// 当前时间DatespecificDate=newDate(1234567890000L);// 指定毫秒数// 打印值System.out.println("当前时间: "+currentDate);// 输出示例: 当前时间: Mon Dec 25 14:30:45 CST 2023System.out.println("指定时间: "+specificDate);// 输出示例: 指定时间: Fri Feb 13 20:31:30 CST 2009// Date转字符串 (yyyy-MM-dd HH:mm:ss)SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-dd HH:mm:ss");StringdateString=sdf.format(currentDate);System.out.println("Date转字符串: "+dateString);// 输出示例: Date转字符串: 2023-12-25 14:30:45// 字符串转Date (yyyy-MM-dd HH:mm:ss)try{StringtimeStr="2023-12-25 14:30:45";DateparsedDate=sdf.parse(timeStr);System.out.println("字符串转Date: "+parsedDate);// 输出示例: 字符串转Date: Mon Dec 25 14:30:45 CST 2023}catch(Exceptione){e.printStackTrace();}2. Calendar 类
介绍
Calendar是Date的改进版本,提供了更丰富的日期操作方法,可以方便地获取和设置日期的各个组成部分。
使用场景
- 需要获取或设置日期的特定部分(年、月、日等)
- 复杂的日期计算
- 本地化日期处理
代码示例
importjava.util.Calendar;importjava.text.SimpleDateFormat;// 创建和赋值Calendarcalendar=Calendar.getInstance();calendar.set(2023,Calendar.DECEMBER,25,14,30,45);// 打印值System.out.println("Calendar时间: "+calendar.getTime());// 输出示例: Calendar时间: Mon Dec 25 14:30:45 CST 2023// Calendar转字符串 (yyyy-MM-dd HH:mm:ss)SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-dd HH:mm:ss");StringcalendarString=sdf.format(calendar.getTime());System.out.println("Calendar转字符串: "+calendarString);// 输出示例: Calendar转字符串: 2023-12-25 14:30:45// 字符串转Calendar (yyyy-MM-dd HH:mm:ss)try{StringtimeStr="2023-12-25 14:30:45";CalendarparsedCalendar=Calendar.getInstance();parsedCalendar.setTime(sdf.parse(timeStr));System.out.println("字符串转Calendar: "+parsedCalendar.getTime());// 输出示例: 字符串转Calendar: Mon Dec 25 14:30:45 CST 2023}catch(Exceptione){e.printStackTrace();}3. LocalDateTime (Java 8+)
介绍
LocalDateTime是Java 8引入的新时间API的一部分,位于java.time包中。它是不可变的、线程安全的,并提供了丰富的方法来进行日期时间操作。
使用场景
- 现代Java应用开发
- 需要线程安全的日期时间处理
- 复杂的日期时间计算和格式化
代码示例
importjava.time.LocalDateTime;importjava.time.format.DateTimeFormatter;// 创建和赋值LocalDateTimecurrentDateTime=LocalDateTime.now();// 当前时间LocalDateTimespecificDateTime=LocalDateTime.of(2023,12,25,14,30,45);// 打印值System.out.println("当前时间: "+currentDateTime);// 输出示例: 当前时间: 2023-12-25T14:30:45.123System.out.println("指定时间: "+specificDateTime);// 输出示例: 指定时间: 2023-12-25T14:30:45// LocalDateTime转字符串 (yyyy-MM-dd HH:mm:ss)DateTimeFormatterformatter=DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");StringdateTimeString=currentDateTime.format(formatter);System.out.println("LocalDateTime转字符串: "+dateTimeString);// 输出示例: LocalDateTime转字符串: 2023-12-25 14:30:45// 字符串转LocalDateTime (yyyy-MM-dd HH:mm:ss)StringtimeStr="2023-12-25 14:30:45";LocalDateTimeparsedDateTime=LocalDateTime.parse(timeStr,formatter);System.out.println("字符串转LocalDateTime: "+parsedDateTime);// 输出示例: 字符串转LocalDateTime: 2023-12-25T14:30:454. LocalDate (Java 8+)
介绍
LocalDate表示不带时间的日期,只包含年、月、日信息。
使用场景
- 只需要处理日期而不需要时间的场景
- 生日、纪念日等日期记录
- 日期范围计算
代码示例
importjava.time.LocalDate;importjava.time.format.DateTimeFormatter;// 创建和赋值LocalDatecurrentDate=LocalDate.now();// 今天LocalDatespecificDate=LocalDate.of(2023,12,25);// 指定日期// 打印值System.out.println("今天: "+currentDate);// 输出示例: 今天: 2023-12-25System.out.println("指定日期: "+specificDate);// 输出示例: 指定日期: 2023-12-25// LocalDate转字符串 (yyyy-MM-dd HH:mm:ss)// 注意:LocalDate只有日期部分,时间部分默认为00:00:00DateTimeFormatterformatter=DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");StringdateString=currentDate.atStartOfDay().format(formatter);System.out.println("LocalDate转字符串: "+dateString);// 输出示例: LocalDate转字符串: 2023-12-25 00:00:00// 字符串转LocalDate (yyyy-MM-dd HH:mm:ss)StringdateStr="2023-12-25 14:30:45";LocalDateparsedDate=LocalDate.parse(dateStr.substring(0,10));// 只取日期部分System.out.println("字符串转LocalDate: "+parsedDate);// 输出示例: 字符串转LocalDate: 2023-12-255. LocalTime (Java 8+)
介绍
LocalTime表示不带日期的时间,只包含时、分、秒、纳秒信息。
使用场景
- 只需要处理时间而不需要日期的场景
- 工作时间、营业时间等时间记录
- 时间段计算
代码示例
importjava.time.LocalTime;importjava.time.format.DateTimeFormatter;// 创建和赋值LocalTimecurrentTime=LocalTime.now();// 当前时间LocalTimespecificTime=LocalTime.of(14,30,45);// 指定时间// 打印值System.out.println("现在时间: "+currentTime);// 输出示例: 现在时间: 14:30:45.123System.out.println("指定时间: "+specificTime);// 输出示例: 指定时间: 14:30:45// LocalTime转字符串 (yyyy-MM-dd HH:mm:ss)// 注意:LocalTime只有时间部分,日期部分需要额外补充LocalDatedummyDate=LocalDate.now();DateTimeFormatterformatter=DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");StringtimeString=dummyDate.atTime(currentTime).format(formatter);System.out.println("LocalTime转字符串: "+timeString);// 输出示例: LocalTime转字符串: 2023-12-25 14:30:45// 字符串转LocalTime (yyyy-MM-dd HH:mm:ss)StringtimeStr="2023-12-25 14:30:45";LocalTimeparsedTime=LocalTime.parse(timeStr.substring(11));// 只取时间部分System.out.println("字符串转LocalTime: "+parsedTime);// 输出示例: 字符串转LocalTime: 14:30:45总结
| 时间类型 | 特点 | 主要使用场景 |
|---|---|---|
Date | 传统时间类,功能简单 | 兼容旧代码、简单时间戳 |
Calendar | 功能丰富,可设置各部分 | 复杂日期操作、本地化处理 |
LocalDateTime | 线程安全,API现代 | 新项目开发、复杂时间处理 |
LocalDate | 仅日期部分 | 生日、纪念日等日期记录 |
LocalTime | 仅时间部分 | 工作时间、营业时间等记录 |
SQL Server 时间类型与 Java 类型映射
SQL Server 时间类型映射关系
1.date类型
- 可映射的 Java 类型:
LocalDate(推荐)DateTimestamp
- 推荐类型:
LocalDate - 原因:
LocalDate只包含日期部分,与 SQL Serverdate类型完美匹配
2.datetime类型
- 可映射的 Java 类型:
LocalDateTime(推荐)TimestampDate
- 推荐类型:
LocalDateTime - 原因:
LocalDateTime是现代时间API,线程安全且API友好
3.datetime2类型
- 可映射的 Java 类型:
LocalDateTime(推荐)TimestampDate
- 推荐类型:
LocalDateTime - 原因:提供更高精度,
LocalDateTime能很好地处理这种精度
4.smalldatetime类型
- 可映射的 Java 类型:
LocalDateTime(推荐)TimestampDate
- 推荐类型:
LocalDateTime - 原因:虽然精度较低,但
LocalDateTime仍是最合适的现代API选择
5.time类型
- 可映射的 Java 类型:
LocalTime(推荐)Date(需配合日期)Time
- 推荐类型:
LocalTime - 原因:
LocalTime只处理时间部分,与time类型语义一致
6.datetimeoffset类型
- 可映射的 Java 类型:
OffsetDateTime(推荐)ZonedDateTime
- 推荐类型:
OffsetDateTime - 原因:专门用于处理带时区偏移的时间数据
推荐总结
| SQL Server 类型 | 推荐 Java 类型 | 理由 |
|---|---|---|
date | LocalDate | 语义匹配,只包含日期 |
datetime | LocalDateTime | 现代API,功能完整 |
datetime2 | LocalDateTime | 高精度支持 |
smalldatetime | LocalDateTime | API一致性 |
time | LocalTime | 只处理时间部分 |
datetimeoffset | OffsetDateTime | 时区偏移支持 |
推荐优先使用java.time包中的新时间API,因为它们是不可变的、线程安全的,并提供了更清晰的API设计。