1.Grails中的时间机制:
1、首先,要知道的是,在页面中选定的时间传到服务器时,因为通过网路只能传递字符串数据,所以并不能传过来整形、日期这种Java数据类型。
这就导致了需要进行如下处理:
trainClassInstance.meetingDt = params.date('meetingDt','yyyy-MM-dd')
trainClassInstance.clearErrors()
trainClassInstance.validate()
代码理解:通过params.date('meetingDt','yyyy-MM-dd') 可以通过params取到字符串型的日期数据,然后调用date方法就可以将字符串转为java date数据类型,其中'yyyy-MM-dd'是传过来的数据格式
实现同样的效果也可以这样写:
Date.parse('yyyy-MM-dd',params.meetingDt)
而下面的clearErrors() 和validate() 方法的作用是针对Grails中返回的日期字段中因为没有日期数据而是null的错误(意思是:直接返回的meetingInstance.meetingDt的值其实是null),在我们进行手动赋值后清除这个错误的,否则下面的代码还会报错:
2、结合java中的date机制,可以理解,使用Grails标签获取到日期是格林威治时间样式:2016-03-12 13:57:37 CST ,所以显示的时候需要格式化一下,才能以字符串的形式显示想要的日期格式。
这里定制时间格式可以使用下面的后端改为相应格式的String对象让前端展示。也可以使用g:formatDate 标签来在前端改变时间样式:
<g:formatDate format="yyyy/MM/dd" date="${trainClassInstance?.endDate}"/>
2.处理时间格式转化的代码:
1、首先,要理解java中的date类机制:
1)Date是没有格式的。
Date是一个包装了毫秒值的瘦包装器,表示自 1970 年 1 月 1 日 00:00:00 GMT 以来经过的毫秒数。
至于为何选择这个时间作为标准呢,历史事件为:
1969年8月,贝尔实验室的程序员肯汤普逊利用妻儿离开一个月的机会,开始着手创造一个全新的革命性的操作系统,他使用B编译语言在老旧的PDP-7机器上开发出了Unix的一个版本。随后,汤普逊和同事丹尼斯里奇改进了B语言,开发出了C语言,重写了UNIX,新版于1971年发布。
那时的计算机操作系统是32位,时间用32位有符号数表示,则可表示 68 年,
用32位无符号数表示,可表示136年。他们认为 以 1970年 为时间 原点 足够可以了。 因此,C 的 time 函数 就这么 定了,后来的 java 等也用它,微机也用它,工作站本来就是unix系统当然也用它。(今后若用64位机年限更没问题。)
1970年1月1日 算 UNIX 和 C语言 生日。
由于主流计算机和操作系统都用它,其他仪器,手机等也就用它了。
2)那么我们通常说的日期格式是怎么回事呢?
我们说的日期格式,是将Date,即是毫秒数按照一定的格式展示给我们,展示出来的值是【String字符串】而不是【Date日期】
所以,你可以将Date转化为任意你要的格式
举例说明下:
所以,也就可以理解上面保存的date数据取出来都是格林威治时间样式,而不是我们看到的各种样式。
2、基于以上的理解,也就可以理解时间处理中最常用的两个工具:simpleDateFormat 和 getTime() 、setTime()
1)simpleDateFormat : 该工具类用于处理时间,常用两个方法举例如下
首先,实例化工具对象 SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
1. formatter.parse(str) 用于将字符串进行解析,返回日期格式,其中str必须是"yyyy-MM-dd"的样式
2. formatter.format(date) 用于对某个date对象进行格式定制,返回字符串对象,且格式为 "yyyy-MM-dd"
2)getTime() 、setTime() 方法解析
1. getTime方法解读
getTime方法用于获得自1970年1月1日00:00:00 GMT开始到现在所表示的毫秒数。
语法 public long getTime()
返回值:返回自1970年1月1日 00:00:00 GMT开始到现在所表示的毫秒数。
示例 本示例使用Date类的getTime方法,获得自1970年1月1日 00:00:00 GMT开始到现在所表示的毫秒数。
public static void main(String[] args) {
Date date = new Date();//创建现在的日期
long value = date.getTime();//获得毫秒数
System.out.println("日期:"+date);
System.out.println("到现在所经历的毫秒数为: "+value);
}
运行本示例,将在控制台输出日期及自1970年1月1日00:00:00 GMT开始所表示的该日期的毫秒数。
由于Date类所创建对象的时间是变化的,所以每次运行程序在控制台所输出的结果都是不一样的。
2. setTime方法解读
setTime方法用于设置当前Date对象所表示的日期/时间值,该值是表示1970年1月1日 00:00:00 GMT以后time毫秒的时间点。
语法 public void setTime(long time)
参数:time是设置的毫秒数。
示例 本示例使用Date类的setTime方法,设置当前Date对象自1970年1月1日 00:00:00 GMT开始到现在所表示的毫秒的时间点,并在控制台输出这个时间点。
public static void main(String[] args) {
Date date = new Date(); //创建日期对象
System.out.println("创建的日期对象为:\n " + date);
date.setTime(302676633308L); //设置毫秒值
System.out.println("输出指定时间点"302676633308"表示的Date对象:\n " + date);
}
运行本示例,将在控制台输出当前日期及设置自1970年1月1日 00:00:00 GMT开始所表示毫秒数的时间点。
注意:在使用Date类的setTime方法设置毫秒数时,如果设置的值超出了int型数据的范围,则必须在该数值后加一个小写的l或大写的L来表示是一个长整数;否则程序会出错。