java日期和时间
Java常用类:日期和时间
时间戳
Long timestamp = System.currentTimeMillis();
日期
-
java.util.Data类
import java.text.SimpleDateFormat; import java.util.Date; //创建时间对象 Date date = new Date(); System.out.println(date);//日期对象:Sun Feb 21 11:14:19 CST 2021 //获取时间戳 System.out.println(date.getTime());//Long类型 //格式化输出时间 System.out.println(date.toString());//字符串:Sun Feb 21 11:14:19 CST 2021
-
java.sql.Date类
对应数据库的日期类型的变量
@Test public static void test() { /* java.util.Date的三个子类: java.sql.Date YYYY java.sql.Time HHMMSS java.sql.TimeStamp YYYYHHMMSS 对Date的扩充 都和数据库操作有关 */ //方法一:创建sql.Date对象 Date date = new Date(System.currentTimeMillis());//sql.Date没有无参构造 System.out.println(date);//2021-03-11 //方法二:创建sql.Date对象 Date date1 = Date.valueOf("2021-03-11");//util.Date没有该方法 System.out.println(date1);//2021-03-11 //sql.Date---->util.Date //java.util.Date date2 = date;//父类引用指向子类的对象 //System.out.println(date2.toString());//2021-03-11,依然没有时分秒,子类重写了父类的方法 java.util.Date date2 = new java.util.Date(date1.getTime());//利用util.Date的有参构造,先将sql.Date转成时间戳 System.out.println(date2);//Thu Mar 11 00:00:00 CST 2021 //util.Date---->sql.Date java.util.Date date3 = new java.util.Date();//Thu Mar 11 22:10:56 CST 2021 Date date4 = new Date(date3.getTime()); System.out.println(date4);//2021-03-11 }
-
SimpleDateFormat类
//用 SimpleDateFormat类,日期转字符串 SimpleDateFormat s = new SimpleDateFormat("yy-MM-dd HH:mm:ss sss"); System.out.println(s.format(date));//21-02-21 11:20:44 044 //字符串转日期 String str = "21-02-21 11:20:44"; SimpleDateFormat s = new SimpleDateFormat("yy-MM-dd HH:mm:ss");//格式必须与字符串相对应 try { Date d = s.parse(str);//需要处理该方法抛出的异常,否则会报错 System.out.println(d);//日期对象:Sun Feb 21 11:14:19 CST 2021 }catch (java.text.ParseException e){ e.printStackTrace(); }
-
Calendar类
import java.util.Calendar; //Calendar是抽象类,无法通过实例化得到对象 //方式一:创建子类(GregorianCalendar)的对象 //方式二:通过getInstance()方法获取 Calendar cal = Calendar.getInstance();//Calendar对象的属性是可变的 //获取值,get int year = cal.get(Calendar.YEAR);//特别注意:月份MONTH从0开始;DAY_OF_WEEK第一天是星期天(1) System.out.println(year);//2021 //设置值,set cal.set(Calendar.YEAR,2020); //计算add cal.add(Calendar.YEAR,1) //两个Calendar对象比较(时间戳大小) int i = cal1.compareTo(cal2); System.out.println(i);//cal1等于cal2时,返回0;小于,返回-1;大于,返回1 //日历类-->Date对象 cal.getTime(); //Date对象-->日历类 Date date = new Date(); cal.setTime(date);
JDK1.8 新的日期时间API出现
背景
JDK1.0时包含的java.util.Date的大多数方法已被弃用,而JDK1.1时引入的Calendar类也未改善多少,它们面临如下问题:
1.可变性:像日期和时间的类应该是不可变的
2.偏移量:Date中年份时从1900开始,月份是从0开始,容易误解
3.Calendar无法格式化
4.线程不安全,且无法处理闰秒
java8引入的时间API
//获取当前日期、时间
LocalDate date = LocalDate.now();
LocalTime time = LocalTime.now();
LocalDateTime dateTime = LocalDateTime.now();//LocalDateTime使用频率比LocalDate、LocalTime高
//获取指定日期of():年月日、时分秒,无偏移
LocalDateTime.of(2021,02,22,23,05,01);
//getXXX()获取相关属性,以LocalDateTime类为例
LocalDateTime dateTime = LocalDateTime.now();
System.out.println(dateTime);//2021-02-22T23:15:53.057
System.out.println(dateTime.getDayOfYear());//53
System.out.println(dateTime.getDayOfMonth());//22
System.out.println(dateTime.getDayOfWeek());//MONDAY
//不可变性,通过withXXX()设置相关属性
LocalDateTime dateTime1 = dateTime.withYear(2020);
System.out.println("dateTime: "+dateTime);//dateTime: 2021-02-22T23:21:19.657
System.out.println("dateTime1: "+dateTime1);//dateTime1: 2020-02-22T23:21:19.657
//plusXXX(),进行加操作
LocalDateTime dateTime = LocalDateTime.now();
System.out.println(dateTime);//2021-02-22T23:27:49.096
System.out.println(dateTime.plusYears(1));//2022-02-22T23:27:49.096
//minusXXX(),进行减操作
LocalDateTime dateTime = LocalDateTime.now();
System.out.println(dateTime);//2021-02-22T23:27:49.096
System.out.println(dateTime.minusYears(1));//2020-02-22T23:27:49.096
Instance瞬时点对象
//now方法创建Instance对象
Instant instant = Instant.now();
System.out.println(instant);//2021-02-24T14:29:59.735Z
//通过毫秒数创建
Instant instant1 = Instant.ofEpochMilli(1614177554274L);
System.out.println(instant1);//2021-02-24T14:39:14.274Z
//创建不同时区offsetDateTime对象,添加时间偏移量
OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
System.out.println(offsetDateTime);//2021-02-24T22:35:43.848+08:00
//获取时间戳
long l = instant.toEpochMilli();
System.out.println(l);//1614177554274
DateTimeFormatter
//实例化
//方式一:预定义标准格式:
DateTimeFormatter isoLocalDateTime = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
DateTimeFormatter isoLocalDate = DateTimeFormatter.ISO_LOCAL_DATE;
DateTimeFormatter isoLocalTime = DateTimeFormatter.ISO_LOCAL_TIME;
//格式化
LocalDateTime localDateTime = LocalDateTime.now();
String format = isoLocalDateTime.format(localDateTime);
System.out.println(format);//2021-02-25T23:03:14.758
//解析
TemporalAccessor parse = isoLocalDateTime.parse(format);
System.out.println(parse);//{},ISO resolved to 2021-02-25T23:11:00.366
//方式二:本地化相关格式,如oflocaliedDateTime
//常量:FormateStyle.LONG\FormateStyle.MEDIUM\FormateStyle.SHORT
//适用于格式化LocalDateTime对象
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM);
String format1 = dateTimeFormatter.format(localDateTime);
System.out.println(format1);//2021-2-25 23:25:11
DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL);
String format2 = dateTimeFormatter1.format(localDateTime);
System.out.println(format2);//2021年2月25日 星期四
//方式三:自定义格式
DateTimeFormatter dateTimeFormatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime localDateTime1 = LocalDateTime.of(2021, 02, 25, 23, 32, 59);
//格式化
String format3 = dateTimeFormatter2.format(localDateTime1);
System.out.println(format3);//2021-02-25 11:32:59