javajava 日期比较问题

1280人阅读
本文来源于我在InfoQ中文站翻译的文章,原文地址是:q.com/cn/news/2013/01/jsr310-java8为了简化与精化API,在经历了长期的重构工作后,由Stephen Colebourne所领导的,旨在替换Java复杂的日期API的Java Specification Request()已经被添加到了Java 8的中,并且预计在这个月发布M6版本。日期处理是个复杂的问题,特别是Java中的日期处理有着不那么光彩的历史。最初的支持是通过java.util.Date实现的,这是个令人困惑的名字,包含了日期与时间,并且无法实现国际化。此外,它在别的方面也令人沮丧,比如说对属性使用了前后矛盾的偏移量;月份与小时都是基于0,月份中的天数则是基于1,而年则是从1900开始的。在1997年Java 1.1发布时,它通过JDBC提供了对SQL的支持。它也有一个日期,该日期继承自java.util.Date,但却有不同的含义。IBM在1998年贡献了一个替代API(java.util.Calendar),可以实现国际化并且提供了很棒的灵活性,但代价却是带来了很大的复杂性,即便对于相对简单的问题来说亦如此。更糟的是,java.util.Date与java.util.Calendar中的所有属性都是可变的,这样在从访问器中返回时,Date类型(或是Time与Timestamp类型)的任何属性都需要被克隆一份。直到2005年,Stephen Colebourne的库才发布,这个库非常流行并且得到了广泛的使用,它极大程度地改进了Java日期库的境遇,但却需要用户使用外部库。JSR 310构建在这个经验之上,为Java SE标准库本身的java.util.Date与java.util.Calendar提供了替代方案。310是个庞大的API,但使用了一阵后我就发现它前后一致且易于理解。在最新版本中,它通过提供一个高层API(主要由应用使用)以及一个低层API(主要由框架及其他场景使用)来处理复杂性问题。比如说,开发者可以通过低层API扩展对date-time域(YEAR、MONTH、DAY_OF_MONTH及HOUR等)的支持,增加新的域,如“hour-of-fortnight”。层API提供了一系列类,如ZonedDateTime(用于存储带有时区的日期与时间)、LocalDate、LocalTime及LocalDateTime(用于处理“人类”的日期与时间)、还提供了Instant,用于实现日志等功能所需的时间戳,这类似于Java.util.Date。所有这些类都是不可变且线程安全的。现在,JSR 310已经成为Java 8的一部分了,ThreeTen项目也通过OpenJDK建立起来了,用于完成集成工作。提供310参考实现的项目托管在SourceForge上,源代码位于GitHub上。Java的日期与时间API问题由来已久,这次终于在Java 8中进行了彻底的改进,InfoQ英文站的读者也对此举表达出了自己的看法:真不错。很高兴看到日期时间API终于更新了。这个API至少涵盖了Joda-Time库的一些特性,然而,我仍旧觉得在真实的使用场景下,诸如工作日/非工作日的差别/计算等工作还是需要由其他第三方API来实现。事实上,我觉得这是Java中最值得期待的特性。SimpleDateFormat与其他格式化类已经饱受批评,出现了线程安全、重量级、序列化成本高等问题。这可能是Java团队的一个机会,可以彻底消灭这些问题,以一个新的开始为Java创建优秀的API。这个改进来的有些晚,但却是最值得期待的。Java Date API太丑陋,并且复杂,诸如joda-time之类的方式提供了更为强大的日期处理手段。但标准API是非常受欢迎的,因为诸如Hibernate与JPA等框架可以使用标准来进行数据交换。一个常见的问题是当应用分层时,不兼容的技术会导致问题变得复杂。举个例子,标准的JSF日期转换器与joda-time API就不兼容,你需要编写自己的转换器,但即便如此,primefaces日期部件也无法兼容于joda-time,因为他们的实现方式依赖于java.util.Date对象。发布新版的time-api.jar如何,它可以反映出Java 8的情况?0.6.3版(其项目主页上的最新版)依然使用老的包名,如果这样做,那么已经提供了支持的软件(比如说DataNucleus JDO/JPA)就可以在Java 8发布前更新了。我也认为发布新的二进制jar包更合适一点,但通过Ant脚本我可以轻松地从源代码进行构建。Java 8计划在今年10月份正式发布。查看英文原文:
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:775009次
积分:10454
积分:10454
排名:第528名
原创:117篇
转载:14篇
译文:137篇
评论:1804条
(3)(1)(1)(13)(16)(16)(19)(1)(1)(1)(15)(29)(6)(9)(6)(33)(2)(6)(6)(1)(2)(1)(2)(8)(6)(4)(9)(2)(3)(4)(1)(2)(2)(12)(3)(5)(5)(3)(2)(1)(1)(1)(5)(2)(3)日期格式:yyyy-MM-dd HH:mm:ss&
现在将它存放到了SQL2000数据库内。
想实现的功能是:现在的时间(新获取的时间)与数据库内的那个时间相差是否超过5分钟;
我在自学做网站,网站就差这个功能就收工了。特别希望尽快解决这个问题。拜托大家了!
问题补充:你好!很抱歉。这个方法我没整怎么明白。数据库内已存的时间怎么转化成微秒呢。。mercyblitz 写道比较简单,
当前的时间(类型:Timestamp ) currentTime,
数据库时间(类型:Timestamp)& previousTime.
//微秒为单位
final int currentTimeInMills=currentTime.getTime();
final int previousTimeTimeInMills=previousTime.getTime();
// 5分钟转化成微秒
final int fiveMinInMills= 5 * 60 * 1000;
if(currentTimeInMills - previousTimeTimeInMills & fiveMinInMills){ //处理5分钟之后
采纳的答案
楼主把数据库日期格式转化成java.sql.Timestamp,JDBC里面在获取时,调用ResultSet#getTimestamp()这样就行了,然后结合我的代码。
我也开始想用楼上的方法,比较好,不过楼主是新手,稍微复杂了点。
如果读取到Calendar的实例中了,请结合以下两个方法来实现
public abstract void add(int field, int amount)
/*根据日历的规则,为给定的日历字段添加或减去指定的时间量。例如,要从当前日历时间减去 5 天,可以通过调用以下方法做到这一点: */
add(Calendar.DAY_OF_MONTH, -5)
public boolean after(Object when)
//判断此 Calendar 表示的时间是否在指定 Object 表示的时间之后,返回判断结果。
比较简单,
当前的时间(类型:Timestamp ) currentTime,
数据库时间(类型:Timestamp)& previousTime.
//微秒为单位
final int currentTimeInMills=currentTime.getTime();
final int previousTimeTimeInMills=previousTime.getTime();
// 5分钟转化成微秒
final int fiveMinInMills= 5 * 60 * 1000;
if(currentTimeInMills - previousTimeTimeInMills & fiveMinInMills){ //处理5分钟之后
你可以先将他们全部转换成毫秒值,然后进行判断!
把数据库的数据取出来跟现在的数据相减就行了
已解决问题
未解决问题关于java script 实现日期选择框的问题_javascript吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:39,743贴子:
关于java script 实现日期选择框的问题收藏
有这样一段代码,直接放到&head&&/head&之间运行就好使,而想要在&body&&/body&之间调用就不好使,不知道该如何解决,有高手帮帮我啊?谢谢了.&
我想在表单中调用一个时间选择框(现在是两个),请帮帮我啊.
&script&&
var&myC_x,myC_y;&
var&myC_timeset=null,myC_timeset1=&
var&divObj=&
var&inputN&
function&myCalendar()&//构建对象&
{&
var&myDate&=&new&Date();&
this.year&=&myDate.getFullYear();&
this.month&=&myDate.getMonth()+1;&
this.date&=&myDate.getDate();&
this.format=&yyyy-mm-dd&;&
this.style&=&myStyle(1);&
this.show&=&createC&
this.input&=&createI&
}&
function&myStyle(num)&//设置样式&
{&
if(!num||isNaN(num)){alert('参数不对,采用默认样式!');num=1;}&
var&style&=&new&Array();&
style[1]=&.week{background-color:#DfDfont-size:12width:140}&&
+&.ds{width:140font-size:12cursor:hand}&&
+&.mover{border:1px&solid&background-color:#f4f4f4;}&&
+&.move1{border:1px&solid&#5d5d5d;background-color:#f4f4f4;color:#909font-size:12px}&&
+&.tit{background-color:#909EFF;width:140font-size:12color:cursor:default}&&
+&.cs{position:border:1px&solid&#909width:142left:0top:0z-index:9999;}&&
+&.shadow{position:left:0top:0font-family:&Arial&Bfont-size:50color:#d4d4d4;z-index:1;text-align:}&;&
document.write(&&style&type='text/css'&&);&
document.write(style[num]);&
document.write(&&/style&&);&
}&
function&createCalendar()&
{&
var&week&=&new&Array('日','一','二','三','四','五','六');&
document.write(&&div&class='cs'&onselectstart='return&false'&oncontextmenu='return&false'&onmousedown='if(event.button==2)this.style.display=\&none\&'&id='myC_div'&&div&class='shadow'&&/div&&div&style='position:left:0top:0z-index:1'&&);&
//创建头部&
document.write(&&table&class='tit'&id='myC_Top'&onmousedown='myC_x=event.x-parentNode.parentNode.style.pixelLmyC_y=event.y-parentNode.parentNode.style.pixelTsetCapture()'&onmouseup='releaseCapture();'&onmousemove='myCMove(this.parentElement.parentElement);'&&tr&&td&width=10&onmouseover='this.style.color=\&black\&'&onmouseout='this.style.color=\&\&'&onclick='cutYear()'&style='font-family:&Wcursor:'&title='减少年份'&7&/td&&td&title='减少月份'&onmouseover='this.style.color=\&black\&'&onclick='cutMonth()'&onmouseout='this.style.color=\&\&'&width=10&style='font-family:&Wcursor:'&3&/td&&td&align=center&onmouseover=this.className='move1';&onmouseout=this.className='';divHidden(myC.parentElement.nextSibling);&onclick='createyear(&+this.year+&,this);divShow(myC.parentElement.nextSibling);'&&/td&&td&align=center&onclick='createmonth(&+this.month+&,this);divShow(myC.parentElement.nextSibling)'&onmouseover=this.className='move1';&onmouseout=this.className='';divHidden(myC.parentElement.nextSibling);&&/td&&td&width=10&onmouseover='this.style.color=\&black\&'&onmouseout='this.style.color=\&\&'&onclick='addMonth()'&style='font-family:&Wcursor:'&title='增加月份'&4&/td&&td&width=10&style='font-family:&Wcursor:'&onmouseover='this.style.color=\&black\&'&onmouseout='this.style.color=\&\&'&onclick='addYear()'&title='增加年份'&8&/td&&/tr&&/table&&);&
//创建星期条目&
document.write(&&table&class='week'&&tr&&);&
for(i=0;i&7;i++)&
document.write(&&td&align=center&&+week[i]+&&/td&&);&
document.write(&&/tr&&/table&&);&
//创建日期条目&
document.write(&&table&class='ds'&id='myC'&cellspacing=2&cellpadding=0&&);&
for(i=0;i&6;i++)&
{&
document.write(&&tr&&);&
for(j=0;j&7;j++)&
document.write(&&td&width=10%&height=16&align=center&onmouseover='mOver(this)'&onmouseout='mOut(this)'&onclick='if(this.innerText!=\&\&)getValue(inputName,this.innerText);myC_div.style.display=\&none\&'&&/td&&);&
document.write(&&/tr&&);&
}&
document.write(&&/table&&);&
//建建水印&
document.write(&&/div&&);&
//创建选择图层&
document.write(&&div&style='position:left:0top:0z-index:3'&onmouseover=divShow(this)&onmouseout=divHidden(this)&&/div&&);&
document.write(&&/div&&);&
//显示日期&
showDate(this.year,this.month);&
myC_div.style.display='none';&
}&
function&getValue(obj,value)&
{&
eval(obj).value=parseInt(myC_Top.cells[2].innerText)+&-&+parseInt(myC_Top.cells[3].innerText)+&-&+&
}&
function&showDate(year,month)&
{&
var&myDate&=&new&Date(year,month-1,1);&
var&today&=&new&Date();&
var&day&=&myDate.getDay();&
var&length&=&new&Array(31,30,31,30,31,30,31,31,30,31,30,31);&
length[1]&=&((year%4==0)&&(year%100!=0)||(year%400==0))?29:28;&
for(i=0;i&myC.cells.i++)myC.cells[i].innerHTML&=&&&;&
for(i=0;i&length[month-1];i++)&
{&
myC.cells[i+day].innerHTML&=&(i+1);&
if(new&Date(year,month-1,i+1).getDay()==6||new&Date(year,month-1,i+1).getDay()==0){myC.cells[i+day].style.color='red';}&
}&
myC_Top.cells[2].innerText=year+&年&;&
myC_Top.cells[3].innerText=month+&月&;&
with(myC.parentNode.previousSibling.style)&
{&
pixelLeft=myC.offsetL&
pixelTop=myC.offsetT&
height&=&myC.clientH&
width&=&myC.clientW&
}&
myC.parentElement.parentElement.style.height=myC.parentElement.offsetH&
myC.parentElement.previousSibling.innerHTML=&
}&
//一些附加函数--------------------&
//---------Begin-------------------&
function&mOver(obj){obj.className&=&'mover';}&
function&mOut(obj){if(obj.className=='mover')obj.className&=&'';}&
function&addYear(){var&year&=&parseInt(myC_Top.cells[2].innerText);var&month&=&parseInt(myC_Top.cells[3].innerText);&year++;showDate(year,month);}&
function&addMonth(){var&year&=&parseInt(myC_Top.cells[2].innerText);var&month&=&parseInt(myC_Top.cells[3].innerText);month++;if(month&12){month=1;year++;}showDate(year,month);}&
function&cutYear(){var&year&=&parseInt(myC_Top.cells[2].innerText);var&month&=&parseInt(myC_Top.cells[3].innerText);year--;showDate(year,month);}&
function&cutMonth(){var&year&=&parseInt(myC_Top.cells[2].innerText);var&month&=&parseInt(myC_Top.cells[3].innerText);month--;if(month&1){month=12;year--;}showDate(year,month);}&
function&divS(obj)&
{&
if(obj!=divObj)&
{&
obj.style.backgroundColor=&#909eff&;&
obj.style.color='black';&
}&
if(divObj!=null)&
{&
divObj.style.backgroundColor='';&
divObj.style.color='';&
}&
divObj&=&&
}&
function&divShow(obj)&
{&if&(myC_timeset!=null)&clearTimeout(myC_timeset);&
obj.style.display='block';&
}&
function&divHidden(obj){myC_timeset=window.setTimeout(function(){obj.style.display='none'},500);}&
function&createyear(year,obj)//创建年份选择&
{&
var&&
var&oD&
ystr=&&table&class='move1'&cellspacing=0&cellpadding=2&width=&+obj.offsetWidth+&&&;&
ystr+=&&tr&&td&style='cursor:hand'&onclick='createyear(&+(year-20)+&,myC_Top.cells[2])'&align=center&上翻&/td&&/tr&&;&
for(i=year-10;i&year+10;i++)&
if(year==i)&
ystr+=&&tr&style='background-color:#909eff'&&td&style='color:height:16cursor:hand'&align=center&onclick='myC_Top.cells[2].innerText=this.innerTshowDate(&+i+&,parseInt(myC_Top.cells[3].innerText));myC.parentElement.nextSibling.innerHTML=\&\&'&&+i+&年&/td&&/tr&&;&
else&
ystr+=&&tr&&td&align=center&style='cursor:hand'&onmouseover=divS(this)&onclick='myC_Top.cells[2].innerText=this.innerTshowDate(&+i+&,parseInt(myC_Top.cells[3].innerText));myC.parentElement.nextSibling.innerHTML=\&\&'&&+i+&年&/td&&/tr&&;&
ystr+=&&tr&&td&style='cursor:hand'&onclick='createyear(&+(year+20)+&,myC_Top.cells[2])'&align=center&下翻&/td&&/tr&&;&
ystr+=&&/table&&;&
oDiv&=&myC.parentElement.nextS&
oDiv.innerHTML='';&
oDiv.innerHTML&=&&
showDiv(oDiv,obj.offsetTop+obj.offsetHeight,obj.offsetLeft);&
}&
function&createmonth(month,obj)//创建月份选择&
{&
var&&
var&oD&
mstr=&&table&class='move1'&cellspacing=0&cellpadding=2&width=&+obj.offsetWidth+&&&;&
for(i=1;i&13;i++)&
if&(month==i)&
mstr+=&&tr&style='background-color:#909eff'&&td&style='color:height:16cursor:hand'&align=center&onclick='myC_Top.cells[3].innerText=this.innerTshowDate(parseInt(myC_Top.cells[2].innerText),&+i+&);myC.parentElement.nextSibling.innerHTML=\&\&'&&+i+&月&/td&&/tr&&;&
else&
mstr+=&&tr&&td&align=center&style='cursor:hand'&onmouseover='divS(this)'&onclick='myC_Top.cells[3].innerText=this.innerTshowDate(parseInt(myC_Top.cells[2].innerText),&+i+&);myC.parentElement.nextSibling.innerHTML=\&\&'&&+i+&月&/td&&/tr&&;&
mstr+=&&/table&&;&
oDiv&=&myC.parentElement.nextS&
oDiv.innerHTML='';&
oDiv.innerHTML&=&&
showDiv(oDiv,obj.offsetTop+obj.offsetHeight,obj.offsetLeft);&
}&
function&showDiv(obj,top,left)&
{&
obj.style.pixelTop=&
obj.style.pixelLeft=&
}&
function&myCMove(obj)&
{&
if(event.button==1)&
{&
var&X&=&obj.clientL&
var&Y&=&obj.clientT&
obj.style.pixelLeft=&X+(event.x-myC_x);&
obj.style.pixelTop=&Y+(event.y-myC_y);&
window.status=myC_y;&
}&
}&
function&showDiv2(obj)&
{&
inputName=obj.&
var&e=&
var&ot&=&obj.offsetT&
var&ol=obj.offsetL&
while(obj=obj.parentElement){ot+=obj.offsetTol+=obj.offsetL}&
myC_div.style.pixelTop=ot+e.offsetH&
myC_div.style.pixelLeft=&
myC_div.style.display=&block&;&
}&
function&createInput(name)&
{myC_div.style.display='none';&
document.write(&&input&type='text'&name='&+name+&'&size=20&onfocus='showDiv2(this)'&&);&
}&
//&--------------End&---------------------&
&/script&&
&script&&
var&myCalendar=new&myC&
myCalendar.year=2005;&
myCalendar.show();&
myCalendar.input(&txt1&);&
&/script&&
&input&type=&text&&name=&test&&onfocus=&showDiv2(this)&&readonly=true&
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或5091人阅读
在开发中经常会使用到一些日期方面的操作,下面例子展示几个常用的操作。
1、取得指定日期是星期几
取得指定日期是星期几可以采用下面两种方式取得日期是星期几:
a、使用Calendar类
//根据日期取得星期几
public static String getWeek(Date date){
String[] weeks = {&星期日&,&星期一&,&星期二&,&星期三&,&星期四&,&星期五&,&星期六&};
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int week_index = cal.get(Calendar.DAY_OF_WEEK) - 1;
if(week_index&0){
week_index = 0;
return weeks[week_index];
b、使用SimpleDateFormat类
//根据日期取得星期几
public static String getWeek(Date date){
SimpleDateFormat sdf = new SimpleDateFormat(&EEEE&);
String week = sdf.format(date);
注:格式化字符串存在区分大小写
对于创建SimpleDateFormat传入的参数:EEEE代表星期,如“星期四”;MMMM代表中文月份,如“十一月”;MM代表月份,如“11”;
yyyy代表年份,如“2010”;dd代表天,如“25”
2、取得日期是某年的第几周
根据日期入得日期是某年的第几周。
//取得日期是某年的第几周
public static int getWeekOfYear(Date date){
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int week_of_year = cal.get(Calendar.WEEK_OF_YEAR);
return week_of_
3、得到某年的某个月有多少天
已知年份和月份,取得该月有多少天。
//取得某个月有多少天
public static int getDaysOfMonth(int year,int month){
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, year);
cal.set(Calendar.MONTH, month-1);
int days_of_month = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
return days_of_
4、取得两个日期之间的相差多少天
已知两个日期,计算它们之间相差多少天。
// 取得两个日期之间的相差多少天
public static long getDaysBetween(Date date0, Date date1) {
long daysBetween = (date0.getTime() - date1.getTime() + 1000000) / ;// 0*24*1000
用立即数,减少乘法计算的开销
return daysB
5、完整的测试代码
package org.ml.
import java.text.ParseE
import java.text.SimpleDateF
import java.util.C
import java.util.D
public class CalendarDemo {
public static void main(String[] args) {
String strDate = &&;// 定义日期字符串
SimpleDateFormat format = new SimpleDateFormat(&yyyy-MM-dd&);// 定义日期格式
Date date =
date = format.parse(strDate);// 将字符串转换为日期
} catch (ParseException e) {
System.out.println(&输入的日期格式不合理!&);
System.out.println(strDate + &是:& + getWeek(date));
System.out.println(strDate + &是一年的第:& + getWeekOfYear(date) + &周&);
System.out.println(strDate + &是一年的& + (date.getMonth() + 1) + &月有:&
+ getDaysOfMonth(date.getYear(), date.getMonth() + 1) + &天&);
System.out.println(strDate + &距离& + (format.format(new Date())) + &还有&
+ getDaysBetween(date, new Date()) + &天&);
// 根据日期取得星期几
public static String getWeek(Date date) {
// String[] weeks = {&星期日&,&星期一&,&星期二&,&星期三&,&星期四&,&星期五&,&星期六&};
// Calendar cal = Calendar.getInstance();
// cal.setTime(date);
// int week_index = cal.get(Calendar.DAY_OF_WEEK) - 1;
// if(week_index&0){
// week_index = 0;
// return weeks[week_index];
SimpleDateFormat sdf = new SimpleDateFormat(&EEEE&);
String week = sdf.format(date);
// 取得日期是某年的第几周
public static int getWeekOfYear(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int week_of_year = cal.get(Calendar.WEEK_OF_YEAR);
return week_of_
// 取得某个月有多少天
public static int getDaysOfMonth(int year, int month) {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, year);
cal.set(Calendar.MONTH, month-1);
int days_of_month = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
return days_of_
// 取得两个日期之间的相差多少天
public static long getDaysBetween(Date date0, Date date1) {
long daysBetween = (date0.getTime() - date1.getTime() + 1000000) / ;// 0*24*1000
用立即数,减少乘法计算的开销
return daysB
6、测试结果
7、引出的问题
看下面的代码:
public static void main(String[] args) throws Exception{
String strDate = &999-999-999&;// 定义日期字符串
SimpleDateFormat format = new SimpleDateFormat(&yyyy-MM-dd&);// 定义日期格式
Date date =
date = format.parse(strDate);// 将字符串转换为日期
} catch (ParseException e) {
System.out.println(&日期格式有误,请给出正确的日期格式&);
System.out.println(format.format(date));
Java中使用yyyy-MM-dd日期格式进行转换,转换字符串为999-999-999时,没有出现异常,反倒是执行通过了。
运行结果:
解决办法如下:
在date = format.parse(strDate)前面加上format.setLenient(false)就行了。意思是【指定日期/时间解析是否不严格。进行不严格解析时,解析程序可以使用启发式的方法来解释与此对象的格式不精确匹配的输入。进行严格解析时,输入必须匹配此对象的格式。&】
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:184013次
积分:2334
积分:2334
排名:第6960名
原创:50篇
转载:26篇
评论:103条
(1)(2)(1)(2)(1)(1)(1)(2)(4)(9)(17)(17)(10)(9)java与json互相转换(解决日期问题)
JSON 即 JavaScript Object
Natation,它是一种轻量级的数据交换格式,非常适合于服务器与 JavaScript
的交互。本文主要讲解下java和JSON之间的转换,特别是解决互相转换遇到日期问题的情况。
一、需要相关的jar包:
json-lib-xxx.jar
ezmorph-xxx.jar
commons-httpclient-xxx.jar
commons-lang-xxx.jar
commons-logging-xxx.jar
commons-collections-xxx.jar
上面的包可以从下面的连接下载:
http://commons.apache.org/index.html
http://json-lib.sourceforge.net
http://ezmorph.sourceforge.net
&& 二、java-》JSON
1.List-》JSON
view plaincopy to clipboardprint?
List&String& list = new
ArrayList&String&();
list.add("apple");
list.add("orange");
JSONArray jarr = JSONArray.fromObject(list);
System.out.println("list-&json:" +
jarr.toString());
打印结果:list-&json:["apple","orange"]
2.Map-》JSON
view plaincopy to clipboardprint?
Map&String, Object& map = new
HashMap&String, Object&();
map.put("name", "Michael");
map.put("baby", new String[] { "Lucy", "Lily" });
map.put("age", 30);
JSONObject jo = JSONObject.fromObject(map);
System.out.println("map-&json:" +
jo.toString());
打印结果:map-&json:{"age":30,"name":"Michael","baby":["Lucy","Lily"]}
3.bean-&JSON
view plaincopy to clipboardprint?
JsonBean bean = new JsonBean();
bean.setName("NewBaby");
bean.setAge(1);
bean.setBorn(new Date());
jo = JSONObject.fromObject(bean);
System.out.println("bean-&json:" +
jo.toString());
打印结果:bean-&json:{"age":1,"born":{"date":10,"day":3,"hours":14,"minutes":14,"month":2,"seconds":1,"time":8,"timezoneOffset":-480,"year":110},"name":"NewBaby"}
这时你会发现它把bean对象里的util.Date这个类型的所有属性一一转换出来。在实际运用过程中,大多数情况下我们希望能转化为yyyy-MM-dd这种格式,下面就讲一讲如何实现:
首先要写一个新的类JsonDateValueProcessor如下:
view plaincopy to clipboardprint?
public class JsonDateValueProcessor implements JsonValueProcessor
&&& private
String datePattern = "yyyy-MM-dd";
&&& public
JsonDateValueProcessor() {
&&& public
JsonDateValueProcessor(String format) {
this.datePattern =
&&& public
Object processArrayValue(Object value, JsonConfig jsonConfig)
return process(value);
&&& public
Object processObjectValue(String key, Object value,
&&&&&&&&&&&
JsonConfig jsonConfig) {
return process(value);
&&& private
Object process(Object value) {
&&&&&&&&&&&
if (value instanceof Date) {
&&&&&&&&&&&&&&&
SimpleDateFormat sdf = new SimpleDateFormat(datePattern,
&&&&&&&&&&&&&&&&&&&&&&&
Locale.UK);
&&&&&&&&&&&&&&&
return sdf.format((Date) value);
&&&&&&&&&&&
&&&&&&&&&&&
return value == null ? "" : value.toString();
} catch (Exception e) {
&&&&&&&&&&&
return "";
&&& public
String getDatePattern() {
return dateP
&&& public void
setDatePattern(String pDatePattern) {
datePattern = pDateP
测试代码:
view plaincopy to clipboardprint?
JsonBean bean = new JsonBean();
bean.setName("NewBaby");
bean.setAge(1);
bean.setBorn(new Date());
JsonConfig jsonConfig = new JsonConfig();
jsonConfig.registerJsonValueProcessor(Date.class,new
JsonDateValueProcessor());
JSONObject jo = JSONObject.fromObject(bean, jsonConfig);
System.out.println("bean-&json:" +
jo.toString());
打印结果:bean-&json:{"age":1,"born":"","name":"NewBaby"}
这就能得到我们想要的结果了。
三、JSON-》java
1.如何把json的yyyy-MM-dd的转换为Bean中的util.Date类型:
view plaincopy to clipboardprint?
JSONUtils.getMorpherRegistry().registerMorpher(
new DateMorpher(new String[] { "yyyy-MM-dd" }));
String jsonStr = "[{"name": "husband", "age": "26",
"born": ""},{"name": "wife", "age": "20",
"born": ""}]";
Collection&JsonBean& list =
JSONArray.toCollection(JSONArray.fromObject(jsonStr),
JsonBean.class);
//DateUtil.getFormatDate(date,fmtstr)日期转字符串这里不再写代码了
for (JsonBean o : list) {
System.out.println(DateUtil.getFormatDate(o.getBorn(),
"yyyy-MM-dd"));
打印结果:
&&&&&&&&&&
&& 2. JSON-》List、 Map
view plaincopy to clipboardprint?
String listStr = "["apple","orange"]";
Collection&String& strlist =
JSONArray.toCollection(JSONArray.fromObject(listStr));
for (String str : strlist) {
System.out.println(str);
String mapStr =
"{"age":30,"name":"Michael","baby":["Lucy","Lily"]}";
Map&String, Object& map = (Map)
JSONObject.toBean(JSONObject
&&&&&&&&&&&&&&&
.fromObject(mapStr), Map.class);
for (Entry&String, Object& entry :
map.entrySet()) {
System.out.println(entry.getKey() + " " + entry.getValue());
打印结果:
&&&&&&&&&&&
&&&&&&&&&&
&&&&&&&&&&
name Michael
&&&&&&&&&&
&&&&&&&&&&
baby [Lucy, Lily]
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 java 日期比较 的文章

 

随机推荐