全面解析Java日期时间API( 二 )

通过Calendar的静态方法获取一个实例该方法会根据当前系统所在地区来自行决定时区,帮我们创建Calendar实例,这里要注意,实际上根据不同的地区,Calendar有若干个子类实现 。而Calendar本身是抽象类,不能被实例化!我们不需要关心创建的具体实例为哪个子类,我们只需要根据Calendar规定的方法来使用就可以了 。
日历类所解决的根本问题是简化日期的计算,要想表示某个日期还应该使用Date类描述 。Calendar是可以将其描述的时间转化为Date的,我们只需要调用其getTime()方法就可以获取描述的日期的Date对象了 。
通过日历类计算时间:为日历类设置时间,日历类设置时间使用通用方法set 。set(int field,int value),field为时间分量,Calendar提供了相应的常量值,value为对应的值 。
只有月份从0开始:0为1月,以此类推,11为12月,其他时间是正常的从1开始 。也可以使用Calendar的常量 calendar.NOVEMBER……等 。
Calendar.DAY_OF_MONTH 月里边的天---号;Calendar.DAY_OF_WEEK 星期里的天---星期几Calendar.DAY_OF_YEAR 年里的天Calendar calendar=Calendar.getInstance();//构造出来表示当前时间的日历类Date now=calendar.getTime();//获取日历所描述的日期calendar.set(Calendar.YEAR, 2019);//设置日历表示2019年 calendar.set(Calendar.DAY_OF_MONTH,15);//设置日历表示15号calendar.add(Calendar.DAY_OF_YEAR, 22);//想得到22天以后是哪天calendar.add(Calendar.DAY_OF_YEAR, -5);//5天以前是哪天calendar.add(Calendar.MONTH, 1);得到1个月后是哪天System.out.println(calendar.getTime());获取当前日历表示的日期中的某个时间单位可以使用get方法 。
int year = calendar.get(Calendar.YEAR);int month = calendar.get(Calendar.MONTH)int day = calendar.get(Calendar.DAY_OF_MONTH);System.out.println(year+"年"+(month+1)+"月"+day+"日");//month要处理SimpleDateFormat类
常用构造方法
SimpleDateFormat(String pattern),pattern -为描述日期和时间格式的模式
用给定的模式和默认语言环境的日期格式符号构造 SimpleDateFormat 。注:此构造方法可能不支持所有语言环境 。要覆盖所有语言环境,请使用 DateFormat 类中的工厂方法 。
常用方法
public final String format(Date date)将一个 Date 格式化为日期/时间字符串public Date parse(String source)throws ParseException从给定字符串的开始解析文本,以生成一个日期 。字符串转成Date对象
//创建一个SimpleDateFormat并且告知它要读取的字符串格式SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");String dateFormat = "2019-05-31";//创建一个日期格式字符串//将一个字符串转换为相应的Date对象Date date = sdf.parse(dateFormat);//要先捕获异常System.out.println(date);//输出这个Date对象Date对象转成字符串
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date date = new Date(); String dateStr = sdf.format(date);//把日期对象传进去,继承自DateFormat类的方法 。将一个Date格式化为日期/时间字符串在日期格式中,-和空格无特殊意义 。无特殊含义的都原样输出
//将当前系统时间转换为2012/05/14 17:05:22的效果SimpleDateFormat format1 = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");dateStr=format1.format(date);System.out.println(dateStr);DateFormat类
java.text.DateFormat类(抽象类)是SimpleDateFormat类的父类,用的少,没SimpleDateFormat灵活 。
java.sql.Date
java.sql.Date继承java.util.Date,为了把前者转为后者,需要以下代码
Date date = new Date();//java.sql.Date 不支持Date参数的构造器,传入long类型的时间java.sql.Date d = new java.sql.Date(date.getTime());System.out.println(d);System.out.println(d.getHours());输出结果
2019-05-31Exception in thread "main" java.lang.IllegalArgumentException at java.sql.Date.getHours(Unknown Source) at DateTest.DateTest1.main(DateTest1.java:40)这是由于java.sql.Date是SQL中的单纯的日期类型,没有时分秒 。故一般通过JDBC插入java.sql.Date数据时,会发现时分秒都没有 。因此,如果同时需要日期和时间,应该使用Timestamp 。它也是 java.util.Date 的子类,Timestamp 则包含时间戳的完整信息 。
java.sql.Timestamp是java.util.Date的派生类(继承),所以在java.util.Date上能做的事,也可以在java.sql.Timestamp上做 。
如果当前是2019-06-01 14:35,你创建一个java.sql.Date 将只记下2019-06-01这个信息 。若你需要保留时间进行JDBC操作,请使用java.sql.Timestamp代替 。
long time = System.currentTimeMillis();java.sql.Timestamp timestamp = new java.sql.Timestamp(time);timestamp.setNanos(123456);int nanos = timestamp.getNanos(); // nanos = 123456


推荐阅读