日期类
第一代日期类
Data
精确到毫秒,代表特定的瞬间
SimpleDateFormat
格式和解析日期的具体类;它允许进行格式化(日期–>文本)、解析(文本–>日期)和规范化
//第一代日期类
public static void main(String[] args) throws ParseException {
// import java.sql.Date;
// 注意,上面的这个包是数据库中的Date,引包的时候要留意,别引错
// 获取当前系统时间
Date date1 = new Date();//当前日期是:Mon Aug 26 21:33:59 CST 2024
System.out.println("当前日期是:"+date1);
//通过指定毫秒数得到时间
Date date2 = new Date(643643);
System.out.println(date2);//Thu Jan 01 08:10:43 CST 1970
//获取某个时间对应的毫秒数
System.out.println(date1.getTime());//1724679239617
// 1.创建SimpleDateFormat 对象,可以指定相应的格式
// 2.这里的格式是使用的字母是规定好的,不能乱写
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss E" );
String format = sdf.format(date1);//format:将日期转换成指定格式的字符串
//此时的输出就符合预期了
System.out.println("当前日期是="+format);//当前日期是=2024年08月26日 09:41:28 星期一
//1.可以把一个格式化的String转成对应的Date
//2.得到Date 仍然在输出时,还是按照国外的形式,如果希望指定格式输出,需要转换
//3.在把String-->Date s 字符串的sdf格式一定要跟你上面给的String格式相同,
// 否则会报错,抛出一个转换异常ParseException: Unparseable date: "2003年11月10 11:10:02 星期五"
String s = "2003年11月10日 11:10:02 星期五";
Date parsed = sdf.parse(s);
System.out.println("parse = "+parsed);//parse = Mon Nov 10 11:10:02 CST 2003
//转换
System.out.println("转回原来的看着顺眼的格式parse= "+sdf.format(parsed));
//转回原来的看着顺眼的格式parse= 2003年11月10日 11:10:02 星期一
}
//顺便补充说明下diagram中的properties的含义
//写了setXXX或者getXXX的方法,diagram中会将XXX识别为属性field
第二代日期类
Calendar类
Calendar类是一个抽象类,它为特定瞬间与一组诸如YEAR、MONTH、DAY_OF_MONTH、HOUR等日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法
//第二代日期类
/**
* 1.Calendar是一个抽象类,并且构造器是private
* 2.可以通过getInstance()来获取实例
* 3.提供大量的方法和字段提供给程序员
* 4.Calendar没有专门的格式化方法,所以需要程序员自己来组合显示输出
* 5.如果我们需要按照24小时来获取时间; Calendar.HOUR ==改成=> Calendar.HOUR_OF_DAY
*/
Calendar c = Calendar.getInstance();//创建日历类对象
System.out.println(c);//java.util.GregorianCalendar[time=1724681049591,
// areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.
// calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,
// useDaylight=false,transitions=29,lastRule=null],firstDayOfWeek=1,
// minimalDaysInFirstWeek=1,ERA=1,YEAR=2024,MONTH=7,WEEK_OF_YEAR=35,
// WEEK_OF_MONTH=5,DAY_OF_MONTH=26,DAY_OF_YEAR=239,DAY_OF_WEEK=2,
// DAY_OF_WEEK_IN_MONTH=4,AM_PM=1,HOUR=10,HOUR_OF_DAY=22,MINUTE=4,
// SECOND=9,MILLISECOND=591,ZONE_OFFSET=28800000,DST_OFFSET=0]
//获取日历对象的某个日历字段
System.out.println("年: "+c.get(Calendar.YEAR));//年: 2024
//Calendar返回月的时候,是按照0开始编号的,所以要+1
System.out.println("月: "+(c.get(Calendar.MONTH)+1));//月: 8 注意括号
System.out.println("日: "+c.get(Calendar.DAY_OF_MONTH));//日: 26
System.out.println("时: "+c.get(Calendar.HOUR));//时: 10
System.out.println("分: "+c.get(Calendar.MINUTE));//分: 9
System.out.println("秒: "+c.get(Calendar.SECOND));//秒: 25
//Calendar没有专门的格式化方法,所以需要程序员自己来组合显示
System.out.println(c.get(Calendar.YEAR)+"年-"+(c.get(Calendar.MONTH)+1)+"月-"+c.get(Calendar.DAY_OF_MONTH)+"日");
//2024年-8月-26日
第三代日期类
前面两代日期不足分析;
JDK1.0中包含了一个Java.util.Date类,但是它的大多数方法已经在JDK1.1引入了
Calendar类之后被弃用了,而Calendar也存在问题:
- 可变性:像日期和时间这样的类应该是不可变的
- 偏移性:Date中的年份是从1990开始的,而月份是都从0开始的
- 格式化:格式化只对Date有用,Calendar则不行
- 此外,它们也不是线程安全的;不能处理闰秒等(每隔2天,多出1s)