jdk7: 代码麻烦, 多线程环境会导致数据安全问题 jdk8: 简单, 时间日期对象不可变, 解决上面jdk7出现的问题
Date 时间 SimpleDateFormat 格式化时间 Calendar 日历
jdk8新时间相关类
Date类: ZoneId 时区 洲名/城市名 比如: Asia/Shanghai(亚洲/上海) Asia/Taipei(亚洲/台北) Asia/Chongqing(亚洲/重庆) 国家名/城市名 比如: Australia/Canberra(澳大利亚/堪培拉) America/New_York(美国/纽约) Instant 时间戳 (没有时区, 所以要加8个小时, 因为我们在东八区) ZonedDateTime 带时区的时间 日期格式化类: DateTimeFormatter 格式化和分析时间 日历类: LocalDate 年、月、日 LocalTime 时、分、秒 LocalDateTime 年、月、日、分、秒 工具类: Duration 计算时间间隔 (秒, 纳秒) Period 计算时间间隔 (年, 月, 日) ChronoUnit 计算时间间隔 (所有单位)
import java.time.ZoneId; import java.util.Set; public class Test { public static void main(String[] args) { Set<String> zoneIds = ZoneId.getAvailableZoneIds(); //获取java支持的所有时区 ZoneId zoneId = ZoneId.systemDefault(); // ZoneId of = ZoneId.of("Asia/Shanghai"); //获取指定时区 } }
import java.time.Instant; import java.time.ZoneId; import java.time.ZonedDateTime; public class Test { public static void main(String[] args) { Instant now = Instant.now(); //获得当前时间Instant对象 (标准时间) //根据 (秒/m秒/纳秒) 获取Instant对象 Instant instant1 = Instant.ofEpochMilli(0); //毫秒 Instant instant2 = Instant.ofEpochSecond(1); //秒 Instant instant3 = Instant.ofEpochSecond(1,1000000000); //秒, 纳秒 //指定时区 ZonedDateTime zonedDateTime = Instant.now().atZone(ZoneId.of("Asia/Shanghai")); //判断 Instant instant4 = Instant.ofEpochMilli(0); Instant instant5 = Instant.ofEpochMilli(1000); //用于判断时间 //isBefore: 判断调用者代表的时间是否在参数表示时间之前 boolean before = instant4.isBefore(instant5); //true //isAfter: 判断调用者代表的时间是否在参数表示时间后面 boolean after = instant4.isAfter(instant5); //false ////减少时间系列的方法 Instant instant6 = Instant.ofEpochMilli(3000); Instant instant7 = instant6.minusSeconds(1); //秒 Instant instant8 = instant6.minusMillis(1000); //毫秒 Instant instant9 = instant6.minusNanos(1000000000); //纳秒 ////增加时间系列的方法 Instant instant10 = instant6.plusSeconds(1); //秒 Instant instant11 = instant6.plusMillis(1000); //毫秒 Instant instant12 = instant6.plusNanos(1000000000); //纳秒 } }
import java.time.Instant; import java.time.ZoneId; import java.time.ZonedDateTime; public class Test { public static void main(String[] args) { ZonedDateTime now1 = ZonedDateTime.now(); ///获得当前时间对象 (带时区) ////获指定时间对象 (带时区) /年、月、日、时、分、秒、毫秒 ZonedDateTime time1 = ZonedDateTime .of(2022, 7, 28, 14, 30, 0, 0, ZoneId.of("Asia/Shanghai")); //通过Instant 指定获取时间对象的方式 Instant instant1 = Instant.ofEpochMilli(0); ZoneId zoneId1 = ZoneId.of("Asia/Shanghai"); ZonedDateTime time2 = ZonedDateTime.ofInstant(instant1, zoneId1); //withxxx 修改时间系列的方法 ZonedDateTime time3 = time2.withYear(2021); //修改年 //减少时间, 减少年, 也可以有其他的,比如月和日 ZonedDateTime time4 = time3.minusYears(1); //增加时间, 增加年, 也可以有其他的,比如月和日 ZonedDateTime time5 = time4.plusYears(1); } }
日期格式化类
import java.time.Instant; import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; public class Test { public static void main(String[] args) { //获取时间对象 ZonedDateTime time = Instant.now().atZone(ZoneId.of("Asia/Shanghai")); //分析/格式化器 DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss EE a"); //格式化 String format = dtf.format(time); System.out.println(format); //年月日 字符串转换为 LocalDate DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd"); String str1 = "2022-01-01"; LocalDate localDate = LocalDate.parse(str1, dtf1); System.out.println(localDate); System.out.println(LocalDate.parse(str1)); //年月日时分秒 字符串转换为 LocalDateTime // Locale.US 格式化的作用,例如,中国将根据当地习惯进行格式化 星期天,美国是Sun DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss", Locale.US); String str2 = "2022-01-01 00:00:00"; LocalDateTime localDateTime = LocalDateTime.parse(str2, dtf2); System.out.println(localDateTime); System.out.println(localDateTime.format(dtf));
}
}
日历类
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.Month;
import java.time.MonthDay;
public class Test {
public static void main(String[] args) {
//获取当前时间的日历对象 (包含 年月日)
LocalDate nowDate = LocalDate.now();
System.out.println(nowDate);
//获取指定的时间的日历对象
LocalDate ldDate = LocalDate.of(2022, 7, 7);
System.out.println(ldDate);
//获取年
int year = ldDate.getYear();
//获取月
//方式一:
Month m = ldDate.getMonth();
int month = m.getValue();
//方式二:
int monthValue = ldDate.getMonthValue();
//获取日
int day = ldDate.getDayOfMonth();
//获取一年的第几天
int dayOfYear = ldDate.getDayOfYear();
//获取星期
DayOfWeek dayOfWeek = ldDate.getDayOfWeek();
int value = dayOfWeek.getValue();
//is开头的方法表示判断
boolean before = ldDate.isBefore(nowDate); //判断ldDate是否在nowDate之前
boolean after = ldDate.isAfter(nowDate); //判断ldDate是否在nowDate之后
//with开头的方法表示修改, 只能修改年月日
LocalDate withLocalDate = ldDate.withYear(2000);
//minus开头发方法表示减少, 只能减少年月日
LocalDate minusLocalDate = ldDate.minusYears(1);
//plus开头发方法表示增加, 只能增加年月日
LocalDate plusLocalDate = ldDate.plusYears(1);
//判断今天是否是你的生日
LocalDate birDate = LocalDate.of(2000,7,28);
LocalDate nowDate1 = LocalDate.now();
MonthDay birMd = MonthDay.of(birDate.getMonthValue(),birDate.getDayOfMonth());
MonthDay nowMd = MonthDay.from(nowDate1);
System.out.println("今天是你的生日吗? " + birMd.equals(nowMd));
}
}
import java.time.LocalTime;
public class Test6 {
public static void main(String[] args) {
//获取本地时间的日历对象 (包含 时分秒、纳秒)
LocalTime nowTime = LocalTime.now();
System.out.println(nowTime);
int hour = nowTime.getHour(); //获取时
int minute = nowTime.getMinute(); //获取分
int second = nowTime.getSecond(); //获取秒
int nano = nowTime.getNano(); //获取纳秒
//获取指定的LocalTime对象
LocalTime localTime1 = LocalTime.of(8, 20); //时分
LocalTime localTime2 = LocalTime.of(8, 20,30); //时分秒
LocalTime localTime3 = LocalTime.of(8, 20,30,150); //时分秒、纳秒
//is系列的方法
boolean before = nowTime.isBefore(localTime1); //判断nowTime是否在localTime1之前
boolean after = nowTime.isAfter(localTime1); //判断nowTime是否在localTime1之后
//with系列的方法, 只能修改时、分、秒、纳秒
LocalTime withLocalTime = nowTime.withHour(9);
//minus系列的方法, 减少时、分、秒、纳秒
LocalTime minusLocalTime = nowTime.minusHours(1);
//plus系列的方法, 增加时、分、秒、纳秒
LocalTime plusLocalTime = nowTime.plusHours(1);
}
}
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
public class Test {
public static void main(String[] args) {
//获取当前时间的日历对象 (包含 年月日时分秒)
LocalDateTime nowDateTime = LocalDateTime.now();
System.out.println("今天是: " + nowDateTime);
System.out.println(nowDateTime.getYear()); //年
System.out.println(nowDateTime.getMonth()); //月
System.out.println(nowDateTime.getDayOfMonth()); //日
System.out.println(nowDateTime.getHour()); //时
System.out.println(nowDateTime.getMinute()); //分
System.out.println(nowDateTime.getSecond()); //秒
System.out.println(nowDateTime.getNano()); //纳秒
//日: 当年的第几天
System.out.println("dayOfYear: " + nowDateTime.getDayOfYear());
//星期
System.out.println(nowDateTime.getDayOfWeek());
System.out.println(nowDateTime.getDayOfWeek().getValue());
//月份
System.out.println(nowDateTime.getMonth());
System.out.println(nowDateTime.getMonth().getValue());
//LocalDateTime 转换为 LocalDate
LocalDate ld = nowDateTime.toLocalDate();
System.out.println(ld);
//LocalDateTime 转换为 LocalTime
LocalTime lt = nowDateTime.toLocalTime();
System.out.println(lt);
}
}
工具类
import java.time.LocalDate;
import java.time.Period;
public class Test {
public static void main(String[] args) {
//获取当前日期
LocalDate today = LocalDate.now();
//生日的 年月日
LocalDate birthDate = LocalDate.of(2000, 1, 1);
Period period = Period.between(birthDate, today); //第二个参数减第一个参数
System.out.println("相差的时间间隔对象: " + period); //P22Y6M27D 22年6月27天
System.out.println(period.getYears());
System.out.println(period.getMonths());
System.out.println(period.getDays());
System.out.println(period.toTotalMonths()); //间隔的总月数
}
}
import java.time.Duration;
import java.time.LocalDateTime;
public class Test {
public static void main(String[] args) {
// 获取当前时间对象
LocalDateTime today = LocalDateTime.now();
//生日的日期对象
LocalDateTime birthDate = LocalDateTime.of(2000, 1, 1, 0, 0, 0);
Duration duration = Duration.between(birthDate, today);//第二个参数减第一个参数
System.out.println("相差的时间间隔对象: " + duration);
//PT197872H14M41.916S 197872小时1414分41.916秒
System.out.println(duration.toDays()); //两个时间相差的天数
System.out.println(duration.toHours()); //两个时间相差的小时数
System.out.println(duration.toMinutes()); //两个时间相差的分钟数
System.out.println(duration.toMillis()); //两个时间相差的毫秒数
System.out.println(duration.toNanos()); //两个时间相差的纳秒数
}
}
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
public class Test10 {
public static void main(String[] args) {
//获取当前时间
LocalDateTime today = LocalDateTime.now();
//生日时间
LocalDateTime birthDate = LocalDateTime.of(2000, 1, 1, 0, 0, 0, 0);
System.out.println("相差的年数: " + ChronoUnit.YEARS.between(birthDate, today)); //第二个参数减第一个参数
System.out.println("相差的月数: " + ChronoUnit.MONTHS.between(birthDate, today));
System.out.println("相差的周数: " + ChronoUnit.WEEKS.between(birthDate, today));
System.out.println("相差的天数: " + ChronoUnit.DAYS.between(birthDate, today));
System.out.println("相差的时数: " + ChronoUnit.HOURS.between(birthDate, today));
System.out.println("相差的分数: " + ChronoUnit.MINUTES.between(birthDate, today));
System.out.println("相差的秒数: " + ChronoUnit.SECONDS.between(birthDate, today));
System.out.println("相差的毫秒数: " + ChronoUnit.MILLIS.between(birthDate, today));
System.out.println("相差的微秒数: " + ChronoUnit.MICROS.between(birthDate, today));
System.out.println("相差的纳秒数: " + ChronoUnit.NANOS.between(birthDate, today));
System.out.println("相差的半天数: " + ChronoUnit.HALF_DAYS.between(birthDate, today));
System.out.println("相差的十年数: " + ChronoUnit.DECADES.between(birthDate, today));
System.out.println("相差的世纪(百年)数: " + ChronoUnit.CENTURIES.between(birthDate, today));
System.out.println("相差的千年数: " + ChronoUnit.MILLENNIA.between(birthDate, today));
System.out.println("相差的纪元数: " + ChronoUnit.ERAS.between(birthDate, today));
}
}