java标准库中,最早提供了两种处理日期和时间的类,但是由于很多问题,很多方法都已经弃用了,在JAVA8中引入了java.time包,解决了长久以来存在的诸多弊端。java原本自带的java.util.Date和java.util.Calendar类,实际上这两种类会有线程不安全的风险。
1、System类提供的public static longcurrentTimeMillis()用来返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。此方法使用于计算时间差
2、计算世界时间的主要标准有
1、Date():使用无参构造器创建的对象可以获取本地当前时间。
2、Date(long date)
1、getTime():返回自1970年1月1日00:00:00 GMT以来此Date对象表示的毫秒数。
2、toString():把此Date对象转换为以下形式的String:dowmondd hh:mm:ss zzz
yyyy其中:dow是一周中的某一天(Sun, Mon, Tue,Wed, Thu, Fri, Sat),zzz是时间
标准。
3、其他把部分方法都过时了
他允许进行:
格式化:日期->文本
解析:文本->日期
1、SimpateDateFormat():使用默认的模式和语言环境创建对象。
2、该构造方法可以用参数pattern指定的格式创建一个对象,该对象调用:3的方法
3、public String format(Date date):方法格式化时间对象date
1、public Date parse(String source):从给定字符串的开始解析文本,以生成一个日期。
// 产生一个Date实例
Date date= newDate();
// 产生一个formater格式化的实例 SimpleDateFormat formater = new SimpleDateFormat(); // 打印输出默认的格式 System.out.println(formater.format(date));
SimpleDateFormat formater2= new SimpleDateFormat("yyyy年MM月dd日EEE HH:mm:ss");
System.out.println(formater2.format(date));try{
// 实例化一个指定的格式对象
Date date2= formater2.parse("2008年08月08日星期一08:08:08");
// 将指定的日期解析后格式化按指定的格式输出
System.out.println(date2.toString());
} catch(ParseException e)
{
e.printStackTrace();
}
1、使用Calendar.getInstance()方法
2、调用它的子类GregorianCalendar的构造器。
1、public void set(int field,int value)
2、public void add(int field,int amount)
3、public final Date getTime()
4、public final void setTime(Date date)
注意:获取月份时:一月是0,二月是1,以此类推,12月是11。获取星期时:周日是1,周二是2,。。。。周六是7
Calendar calendar = Calendar.getInstance(); // 从一个Calendar 对象中获取Date 对象 Date date = calendar.getTime(); System.out.println("data1:+"+date); // 使用给定的Date 设置此Calendar 的时间 date = new Date(234234235235L); System.out.println("data2:+"+date); calendar.setTime(date); calendar.set(Calendar.DAY_OF_MONTH, 8); System.out.println("设置为当前时间日期为8号,时间是:" + calendar.getTime()); calendar.add(Calendar.HOUR, 2); System.out.println("当前时间加2小时后,时间是:" + calendar.getTime()); calendar.add(Calendar.MONTH, -2); System.out.println("当前日期减2个月后,时间是:" + calendar.getTime()data1:+Sat Mar 18 17:04:06 CST 2023
data2:+Sat Jun 04 09:03:55 CST 1977
设置为当前时间日期为8号,时间是:Wed Jun 08 09:03:55 CST 1977
当前时间加2小时后,时间是:Wed Jun 08 11:03:55 CST 1977
当前日期减2个月后,时间是:Fri Apr 08 11:03:55 CST 1977
使用十个线程,同一个SimpleDateFormat 对象解析日期文本 public class DateTest {final static SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");public static void main(String[] args) {for (int i = 0; i < 10; i++) {new Thread(()->{try {Date parse = simple.parse("2023-03-18 18:07:04");System.out.println(parse);} catch (ParseException e) {e.printStackTrace();}}).start();}} }
在simple.parse("2023-03-18 18:07:04");这个方法里,
Date类以及Calendar类出现之前,枚举类型是还没有出现的,所以在使用Calendar设置日期、月份、时间,(都是直接使用整型放到方法参数里,魔法值)所以在字段中使用整数常量导致整数常量都是可变的,而不是线程安全的,且还不满足开发规范。为了解决这个问题,标准库中就引入了,java.sql.Date作为java.util.Date的子类,但是还是没能彻底解决这个问题。
jdk8提供的最新类均生成不可变实例,他们是线程安全的,并且这些类不提供公共构造函数,只能通过工厂方法加以实例化。
instant类对时间轴上的单一瞬时点建模,也就是时间戳。可用于记录应用程序中的事件时间戳。
表示秒或纳秒时间间隔,适合处理较短的时间,需要更高的精确性。
表示一段时间的年、月、日
表示不可变的日期时间对象,表示使用ISO-8601日历系统的日期、时间、日期和时间。
它们提供了简单的本地日期或时间,并不包含当前的时间信息,也不包含与时区相关的信息
具有时区的日期时间的不可变表示,此类存储的所有日期和时间字段,精确到纳秒,时区为区域偏移量,用于处理模糊的本地日期时间。
在java中获取时区,通过ZoneId的getAvailableZoneIds方法可以获取到一个Set集合,集合中封装了600个时区。
注:ISO-8601日历系统是国际标准化组织制定的现代公民的日期和时间的表示法,也就是公历