java处理日期和时间
java处理日期和时间
1. jdk API
java.util
- Date
- Calendar
java.time(jdk>=1.8)
- LocalDate
- LocalTime
- ZonedDateTime
- Instant
新API的特点:
- 严格区分日期,时间
- 不变类(类似于String)
- Month范围1-12(Jan-Dec)
- Week范围1-7(Mon-Sun)
2. Date
注意: import java.util
而不是importjava.sql
2.1Date对象的主要方法
- toString() 把Date对象变成字符串
- getTime()把Date对象转换成时间戳
Date now = new Date();
System.out.println(now);
System.out.println(now.toString());// 把now转换成字符形式
System.out.println(now.getTime());// 通过now获取时间戳
结果:
Wed Jun 05 14:03:26 CST 2019
Wed Jun 05 14:03:26 CST 2019
1559714606831
java.util.Date的问题:
- 不能转换时区
- 日期和时间的加减
- 两个日期相差多少天
- 计算某个月第一个星期一
2.2 SimpleDateFormat
yyyy: 年
MM: 月
dd: 日
HH: 时
mm: 分
ss: 秒
Date now = new Date();
// 把Date按照格式转换成字符串
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(now));
// 把字符串按照格式转换成Date对象
String s1 = "2016-11-20 12:15:35";
Date date1 = sdf.parse(s1);
System.out.println(date1);
3. Calendar(日历)
导入: import java.util.Calendar
// 创建实例
Calendar c = Calendar.getInstance();
int y = c.get(Calendar.YEAR);
int m = c.get(Calendar.MONTH);// 得到的月份比实际月份小1
int d = c.get(Calendar.DAY_OF_MONTH);
int w = c.get(Calendar.DAY_OF_WEEK);
int hh = c.get(Calendar.HOUR_OF_DAY);
int mm = c.get(Calendar.MINUTE);
int ss = c.get(Calendar.SECOND);
int ms = c.get(Calendar.MILLISECOND);
Date date = c.getTime();
// 获得时间戳
long ms1 = c.getTimeInMillis();
- Date c.getTime() 获得Date对象
- long getTimelnMillis() 获得毫秒数
- get(int field) 获得年月日, 时分秒
- setTime(Date) 设定时间
- setTimeInMillis(long) 根据时间戳设置时间
- set(int field, int value) 根据年月日等设定时间
- setTimeZone(TimeZone) 更改时区
c.setTimeZone(TimeZone.getTimeZone("America/New_York"))
- add(int field, int value)
// +5 day
c.add(Calendar.DAY_OF_MONTH, 5);
// -2 hours
c.add(Calendar.HOUR_OF_DAY, -2);
4. LocalDateTime
4.1 获取当前日期和时间
- LocalDate
- LocalTime
- LocalDateTime
// 当前日期
LocalDate ld = LocalDate.now();
// 当前时间
LocalTime lt = LocalTime.now();
// 当前日期和时间
LocalDateTime ldt = LocalDateTime.now();
// 指定日期和时间
LocalDate ld2 = LocalDate.of(2016, 11, 30);
LocalTime lt2 = LocalTime.of(15, 16, 17);
LocalDateTime ldt2 = LocalDateTime.of(2016, 11, 30, 15, 16, 17);
LocalDateTime ldt3 = LocalDateTime.of(ld2, lt2);
4.2 DateTimeFormatter
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println(dtf.format(LocalDateTime.now()));
LocalDateTime dt3 = LocalDateTime.parse("2016-12-30 15:16:17", dtf);
System.out.println(dt3);//2016-12-30T15:16:17
4.3 日期和时间的运算
增加:
- plusYears(1): +1年
- plusMonths(1): +1月
- plusDays(1): +1天
- plusHours(1): +1小时
- plusMinutes(1): +1 分钟
- plusSeconds(1): +1 秒
减少
- minusYears(1): +1年
- minusMonths(1): +1月
- minusDays(1): +1天
- minusHours(1): +1小时
- minusMinutes(1): +1 分钟
- minusSeconds(1): +1 秒
LocalDateTime now = LocalDateTime.now();
LocalDateTime d = now.plusDays(1).minusHours(1);
调整年, 月,日, 时, 分, 秒
- withYear(2018): 调整年
- withMonth(): 调整月
- withDayOfMonth(): 调整为本月的第几天
- withDayOfYear(): 调整本年的第几天
- withHour(): 调整小时
- withMinute(): 调整分钟
- withSecond(): 调整秒
判断日期和时间的先后:
- isBefore()
- isAfter()
- equals()
计算两个日期的相差时间:Period
LocalDate d1 = LocalDate.of(2018, 11, 20);
LocalDate d2 = LocalDate.of(2050, 1, 2);
Period p = d1.until(d2);
System.out.println(p);// P31Y1M13D
// 两个日期相差多少天
System.out.println(Math.abs(d1.toEpochDay() - d2.toEpochDay()));// 11366
- p.getYears()
- p.getMonths()
- p.getDays()
5. ZonedDateTime
ZonedDateTime = LocalDateTime + ZoneId
- ZonedDateTime: 带时区的日期和时间
- ZoneId: 新时区对象(取代就的java.util.TimeZone)
- Instant: 时刻对象(内部用long表示epoch seconds)
ZonedDateTime zbj = ZonedDateTime.now();// 当前时区的日期和时间
ZonedDateTime zny = ZonedDateTime.now(ZoneId.of("America/New_York"));// 纽约时区的日期和时间
// 北京时区变成纽约时区
ZonedDateTime ny = zbj.withZoneSameInstant(ZoneId.of("America/New_York"));
// 把LocalDateTime转换成ZonedDateTime
ZonedDateTime bj = LocalDateTime.now().atZone(ZoneId.systemDefault());
Instant: 对象表示某个时刻
Instant ins1 = Instant.now();
Instant ins2 = ZonedDateTime.now().toInstant();
// 注意是秒
long epoch = ins1.getEpochSecond();