日期相关-1

对相同的表执行了不同的sql,返回相同的日期Date页面得到的数据却不同。
日期相关-1_第1张图片
日期相关-1_第2张图片
不同之处在于:
上面取回的数据使用了Mybatis的拦截器进行分页,下面的是直接用了对bean的映射返回的。前者应该是调用了Date的getTime()方法,后者直接放回了Date对象,但是在用EL表达式取值的时候,自动调用了toString()方法。
在下面的取值方式中,可以使用jstl的对date对象进行格式转换。但是上面返回的long类型的时间就不能格式转换了。

<fmt:formatDate value="${tfFCardcoupons.cardEndTime}" pattern="yyyy-MM-dd HH:mm:ss"/>

实验:

fmt:formatDate value="<%=date.getTime() %>" pattern="yyyy-MM-dd HH:mm:ss"/>
fmt:formatDate value="<%=date.toString() %>" pattern="yyyy-MM-dd HH:mm:ss"/>

日期相关-1_第3张图片
都会报错。


总结:用了PageHelper拦截器,得到的数据返回给了js,需要将long的时间还原为date对象,才能正确显示时间。不过幸好,可领取卡券页并没有要显示时间。


java中的时间API

  1. java.util.Date
  2. java.text.DateFormat
  3. java.util.Calendar

基本使用

//得到当前时间
 Date date = new Date();
 DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 df.format(date);//2017-07-03 00:55:02
 //对Date设定特定的时间
 Date dt = df.parse("2017-06-19 00:00:00");
 System.out.println(date.toString());//Mon Jun 19  00:00:00 CST 2017
 //向oracle数据库插入特定的时间戳

java.util.Date是机器时间

两个构造函数

Date date = new Date(System.currentTimeMillis());
Date date = new Date();//内部也是通过系统的epoch毫秒数但会date对象的

用date对象得到得到从1970年1月1日0分0秒0毫秒(Unix余年)至今的毫秒数

date.getTime();

除了上面的两个构造函数,和getTime()函数,其他的构造函数以及get方法set方法都已经废除,因此,不应该对date对象进行设置值,date的唯一作用就是得到epoch,而操作date需要用到java.text.DateFormat抽象类。

格式化时间日期的DateFormat

基本使用由两种
第一种用SimpleDateFormat的format()方法传入date对象
第二种是用DateFormat的三个静态方法

//DATE
getDateInstance(LONG).format(new Date());
getDateInstance(SHORT).format(new Date());
//TIME
getTimeInstance(LONG).format(new Date());
getTimeInstance(MEDIUM).format(new Date());
getTimeInstance(SHORT).format(new Date());
//date time 2*3=6种格式
getDateTimeInstance(LONG,LONG).format(new Date());
getDateTimeInstance(LONG,MEDIUM).format(new Date());
getDateTimeInstance(LONG,SHORT).format(new Date());

处理时间日期的Calendar

Date应该作为时间轴上的瞬时代表,要格式化时间日期通过DateFormat,如果要去的某个时间日期信息,或者对时间日期进行操作,可以使用Calendar实例。
Calendar是个抽象类,java.util.GergorianCalendar是其子类,操作了儒略历和格里高历的混合历。通过Calendar的getInstance()去的的Calendar实例,默认就是取得GergorianCalendar实例。

儒略历和格力高历

1582年颁布,将儒略历的1582年18月3日星期四的隔天,定为格力高历1582年10月15日星期五。
各个国家改历的事件不同,英国的改历事件在1752年9月初,因此在Unix/Linux中查询1752年月历,9月份会平白少了11天。
日期相关-1_第4张图片
我的新bash背景好好看。
在java的Calendar中也可以看到1582年的时间变化
日期相关-1_第5张图片
Calendar的常用方法:
输入年月,输出当年当月的日历。
日期相关-1_第6张图片

日期相关-1_第7张图片


JDK8新时间日期API

  1. java.time.*
  2. java.time.chrono.* –年历设计系统

构造方法–不是用new 而是用静态方法进行构造

LocalTime localTime = LocalTime.of(0,0,0);
LocalDate localDate = LocalDate.of(2017,7.2)
//常用方法:plusDays() plusMonths() plusWeeks()都是返回一个新的LocalDate对象
//of返回的都是一个新的localTime或者localDate对象
//跟被lombok的@getter和@setter注解过的属性一样
//Fluent API 概念
System.out.println(LocalDate.of(2017.7.2).plusDays(5).plusMonths(5).plusWeeks(3).format(ofPattern(E MM/dd/yyyy)));
//每调用一个方法,返回一个新对象,内存不会炸吗,堆够用吗,那就是够用吧,垃圾回收。java真是智能。

JDK8的java.time套件中的类采用的的是单一的ISO8601年历系统

ISO8601

iso8601不是年历系统,而是时间日期表示方法的标准。iso8601在数据定义上大部分与格力高历相同,也有的轻微差别例如:iso8601中定义19世纪是指1900年至1999年(包含该年)[iso8601认为我们现在是20世纪啊,跟我们现在的生活不符呢],格力高历的19世纪是1801年值1900年(包含该年).
如果需要其他年历系统,引入java.time.chrono.*操作的java.time.chrono.Chronology接口的类。

LocalDate birth = LocalDate.of(1975,5,26);
MinguoDate  mingoBirth = MinguoDate.from(birth);
System.out.println(mingoBirth);//Minguo ROC 64-05-26
//民国日历与当前日期的转换

System.out.println(MinguoDate.of(64,5,1).atTime(LocalTime.of(3,30,0)));//民国64年5月1日3时30分

总结

  1. Date一般不操作时间,只用DateFormat抽象类按格式输出那个时间戳的事件
  2. 操作时间戳用java.util.Calendar
  3. 由于java.util.Calendar有很多枚举值,因此jdk8操作时间API是面向人的API,操作更方便。
  4. java的时间和日期还是挺复杂的啊,学了一些内容,以后遇到再学吧。

我要记住的只是:

Date date = new Date();//
date.getTime();//用来比较时间
<fmt:formatDate value="date对象实例" pattern="yyyy-MM-dd HH:mm:ss"/> 
update tf_f_coupon set card_end_time = toDate('2017-06-30','yyyy-mm-dd hh24:mi:ss ')
where card_id='43' --调整卡券的时间进行测试

你可能感兴趣的:(学渣日常)