Grails实战经验程序员IT共论

Grails中的时间字段的处理

2016-03-12  本文已影响971人  煦风

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/dddate="${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来表示是一个长整数;否则程序会出错。

上一篇下一篇

猜你喜欢

热点阅读