Java 日期时间


 

jdk自带的时间日期类

Date

Date的大部分方法都过时了,仅使用以下未过时的方法

//指定时间戳
Date date1 = new Date(11111111111111L);
//缺省参数默认取当前时间戳
Date date2 = new Date();

//获取时间戳 ms
long timestamp1 = date1.getTime();
//获取当前时间戳,ms
long timestamp2 = System.currentTimeMillis();


//时间比较,都是获取ms,通过 >、< 比较,参数为null时均会抛 NPE
boolean before = date1.before(date2);
boolean after = date1.after(date2);
//-1 => date1 < date2,0相等,1 => date1 > date2
int i = date1.compareTo(date2);

 

抽象类 Calendar
//使用静态方法获取实例,默认取当前的时间日期
Calendar calendar=Calendar.getInstance();

//设置指定字段
calendar.set(Calendar.YEAR, 2020);
//设置年月日
calendar.set(2020, 1, 1);
//设置年月日时分秒
calendar.set(2020, 1, 1, 1, 1, 1);
//设置Date类型
calendar.setTime(new Date());

//获取指定字段
calendar.get(Calendar.YEAR)
//0-11,0表示1月
calendar.get(Calendar.MONTH)
//一年中的第几周
int weekYear = calendar.getWeekYear();
//获取Date
Date date = calendar.getTime();

 

jdk8新增的 LocalDateTime
//当前时间
LocalDateTime ldt1=LocalDateTime.now();
//指定时间
LocalDateTime ldt2 = LocalDateTime.of(2020, 1, 1, 1, 1, 1);

//获取指定字段的值
int year = ldt1.getYear();

 

获取指定日期时间的Date对象 GregorianCalendar
//Date api过时,注意year不能直接写,要使用减去1900的值
Date date = new Date(2020 - 1900, 01, 01, 01, 01, 01);

//Calendar是抽象类,不能new直接实例化,转换为Date很麻烦
Calendar calendar=Calendar.getInstance();
calendar.set(2020, 1, 1, 1, 1, 1);
Date date = calendar.getTime();

//LocalDateTime不好转换为Date
LocalDateTime ldt = LocalDateTime.of(2020, 01, 01, 01, 01, 01);

 
可以使用 Calendar 的具体实现类 GregorianCalendar

Date time = new GregorianCalendar(2022, 01, 01, 01, 01, 1).getTime();

 

jdk自带的日期时间格式化

格式字符串
占位符描述
yyyy四位数年份
MM固定2位数的月,不足2位数的自动带前导0,示例:01、11
M月,不带导0,示例:1、11
dd固定2位数的日,不足2位数的自动带前导0,示例:01、11
d日,不带导0,示例:1、11
hh时,12小时制
HH时,24小时制
mm
ss
SSS毫秒
D一年中的第几天
w一年中第几个星期
EEE一周中的第几天,即星期几

 

DateFormat

格式单一,功能简陋,但支持将String类型的时间日期转换为Date对象

//只格式化日期
DateFormat df1 = DateFormat.getDateInstance();
//只格式化时间
DateFormat df2 = DateFormat.getTimeInstance();
//格式化日期时间
DateFormat df3 = DateFormat.getDateTimeInstance();


//均可指定格式,DateFormat类的常量,缺省时默认都是MEDIUM
//日期:SHORT => 2019/5/13 , MEDIUM => 2019年5月13日 , FULL => 2019年5月13日星期一
DateFormat df4 = DateFormat.getDateInstance(DateFormat.SHORT);
//时间:SHORT => 下午10:16 , MEDIUM => 下午10:17:06 , FULL => 中国标准时间 下午10:18:44
DateFormat df5 = DateFormat.getTimeInstance();
//日期格式、时间格式
DateFormat df6 = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT);


//格式化Date对象,返回String
String dateStr = df1.format(new Date());
//将String类型的时间日期转换为Date对象
Date date = df1.parse(dateStr);

 

SimpleDateFormat 推荐

SimpleDateForm是DateForm的子类,简单、强大,是主流方式

//指定格式,可以自定义格式。毫秒是 SSS 
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat sdf2 = new SimpleDateFormat("y年的第D天");

//格式化Date对象,返回字符串
Date date = new Date();
String str1 = sdf1.format(date);
String str2 = sdf2.format(date);

SimpleDateFormat很常用,使用时需要注意2个问题

  • 传入时间的精度要大于等于格式的精度,比如格式为yyyy-MM-dd 精确到天,传入时间精度至少到天,也可以精确到时、分、秒、毫秒。
  • SimpleDateFormat不是线程安全的,使用时最好定义为局部变量,或者封装为工具类,避免出现多线程问题。

 

DateTimeFormatter

相当于DateFormat、SimpleDateFormat的结合体

DateTimeFormatter df1 = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT);   //格式化日期
DateTimeFormatter df2 = DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT);    //格式化时间
DateTimeFormatter df3 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT, FormatStyle.SHORT);   //格式化日期时间

DateTimeFormatter df4 = DateTimeFormatter.ofPattern("y-M-d H:m:s");  //自定义格式


//日期用LocalDate,时间用LocalTime,日期时间用LocalDateTime
LocalDateTime date = LocalDateTime.now();
//格式化,返回String
String format = df1.format(date);

 

common-lang3提供的日期时间工具类

DateUtils

常用常量

//每秒|分钟|小时|天的毫秒数
long millisPerSecond = DateUtils.MILLIS_PER_SECOND;
long millisPerMinute = DateUtils.MILLIS_PER_MINUTE;
long millisPerHour = DateUtils.MILLIS_PER_HOUR;
long millisPerDay = DateUtils.MILLIS_PER_DAY;

 

set、add、getFragment 指定字段处理

//设置指定字段的值,原Date对象不变,以新对象的形式返回
Date date1 = DateUtils.setYears(date, 2020);
Date date1 = DateUtils.setMonths(date, 1);
Date date1 = DateUtils.setDays(date, 1);
Date date1 = DateUtils.setHours(date, 0);
Date date1 = DateUtils.setMinutes(date, 0);
Date date1 = DateUtils.setSeconds(date, 0);
Date date1 = DateUtils.setMilliseconds(date, 0);

//在指定字段上进行加减,正数加、负数减。会自动进位,比如 08.31+1天=>09.01,09.01-1天=>08.31
Date date2 = DateUtils.addYears(date, 1);
Date date2 = DateUtils.addMonths(date, 1);
Date date2 = DateUtils.addDays(date, 1);
Date date2 = DateUtils.addHours(date, 1);
Date date2 = DateUtils.addMinutes(date, 1);
Date date2 = DateUtils.addSeconds(date, 1);
Date date2 = DateUtils.addMilliseconds(date, 1);
Date date2 = DateUtils.addWeeks(date, 1);


//获取指定字段在指定时间范围上的数量
//今年的第几天
long fragmentInDays = DateUtils.getFragmentInDays(date, Calendar.YEAR);
//这个月的第几天
long fragmentInDays = DateUtils.getFragmentInDays(date, Calendar.MONTH);
//今天的第几个小时
long fragmentInHours = DateUtils.getFragmentInHours(date, Calendar.DAY_OF_YEAR);
//今年的第几小时
long fragmentInHours = DateUtils.getFragmentInHours(date, Calendar.YEAR);
//这个小时的第几分钟
long fragmentInMinutes = DateUtils.getFragmentInMinutes(date, Calendar.HOUR_OF_DAY);
//这分钟的第几秒
long fragmentInSeconds = DateUtils.getFragmentInSeconds(date, Calendar.MINUTE);
//这秒钟的第几毫秒
long fragmentInMilliseconds = DateUtils.getFragmentInMilliseconds(date, Calendar.SECOND);

 

parseDate、to 类型转换

//String类型的日期时间 => Date,宽松模式
Date date2 = DateUtils.parseDate("2022-08-31 00:21:22:123", Locale.CHINA, "yyyy-MM-dd HH:mm:ss:SSS");
//缺省Locale 地区、语言时,取jvm默认的Local(和jvm所在OS的Local设置有关)
Date date1 = DateUtils.parseDate("2022-08-31 00:21:22:123", "yyyy-MM-dd HH:mm:ss:SSS");

//严格模式
Date date3 = DateUtils.parseDateStrictly("2022-08-31 00:21:22:123", "yyyy-MM-dd HH:mm:ss:SSS");
Date date4 = DateUtils.parseDateStrictly("2022-08-31 00:21:22:123", Locale.CHINA, "yyyy-MM-dd HH:mm:ss:SSS");


//Date转Calendar
Calendar calendar = DateUtils.toCalendar(date, timeZone);

//缺省时区时,取jvm默认时区(与所在OS的区域设置有关)
Calendar calendar = DateUtils.toCalendar(date);

 

is 比较判断

//是否是同一天
boolean sameDay = DateUtils.isSameDay(date1, date2);
boolean sameDay = DateUtils.isSameDay(calendar1, calendar2);

//是否是同一时刻,直接比较毫秒数,精确到毫秒
boolean isSameInstant = DateUtils.isSameInstant(date1, date2);
boolean isSameInstant = DateUtils.isSameInstant(calendar1, calendar2);

//比较表示的localTime是否相同,会年月日时分秒逐个字段比较
boolean isSameLocalTime = DateUtils.isSameLocalTime(calendar1, calendar2);

 

truncate、ceiling、round 字段保留

//截取日期时间,第二个参数指定截取到哪个字段,只保留到指定字段,其余字段取默认值
//eg. "2022-08-31 20:21:22:123",截取到month => "2022-08-01 00:00:00:000"
Date truncate = DateUtils.truncate(date, Calendar.MONTH);
Date truncate = DateUtils.truncate(calendar, Calendar.MONTH);


//只保留到指定字段,对下一个字段向上取整(0也向上取整,直接进1位),其余字段取默认值
//eg. "2022-08-31 20:21:22:123",保留到day => "2022-09-01 00:00:00:000"
Date ceiling = DateUtils.ceiling(date, Calendar.DAY_OF_MONTH);
Date ceiling = DateUtils.ceiling(calendar, Calendar.DAY_OF_MONTH);


//只保留到指定字段,对下一个字段进行四舍五入,其余字段取默认值
Date round = DateUtils.round(date, Calendar.DAY_OF_MONTH);
Date round = DateUtils.round(calendar, Calendar.DAY_OF_MONTH);

 

DateFormatUtils
//yyyy-MM-dd'T'HH:mm:ss 中间以T分隔
FastDateFormat datetimeFormat1 = DateFormatUtils.ISO_8601_EXTENDED_DATETIME_FORMAT;
//yyyy-MM-dd
FastDateFormat datetimeFormat2 = DateFormatUtils.ISO_8601_EXTENDED_DATE_FORMAT;
//HH:mm:ss
FastDateFormat datetimeFormat3 = DateFormatUtils.ISO_8601_EXTENDED_TIME_FORMAT;
//格式化日期时间,参数可以是Date|Calendar实例、毫秒时间戳
String format1 = DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss");
String format2 = DateFormatUtils.format(Calendar.getInstance(), "yyyy-MM-dd HH:mm:ss");
String format3 = DateFormatUtils.format(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss");

 

FastDateFormat
//获取实例。未指定Locale、TimeZone时,使用jvm默认的(跟jvm所在OS设置的时区地区设置有关)
FastDateFormat fastDateFormat = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss");

String pattern = fastDateFormat.getPattern();


//日期时间的格式化,Date|Calendar实例、毫秒时间戳
String format1 = fastDateFormat.format(new Date());
String format2 = fastDateFormat.format(Calendar.getInstance());
String format3 = fastDateFormat.format(System.currentTimeMillis());

//String类型的日期时间转Date,此方法对String类型的日期时间格式要求严格,不推荐使用
Date parse = fastDateFormat.parse("2022-01-01T00:00:00");
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值