SimpleDateFormat日期格式转换

在08年的项目中经常遇到Calendar(日历)的转化错误,这个错误在Windows环境中不会抛错,将项目部署到Linux中就会抛异常导致功能无法使用,这里做一个总结。

1 Java.util.Date(这里讲String类型转date类型)

包含年、月、日、时、分、秒信息。

格式:Wed Jun 07 15:26:34 CST 2017

问题:

在项目中我发现经常有Date currentDate= new Date();,之后又定义了一个SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");最后在格式化Date date = DateFormat.getDateTimeInstance().parse(sdf.format(currentDate));结果Linux中就抛错了。

其实我将这个问题演练总结了一个,发现格式化是多余的,因为格式化后与新new出来的date格式是一样的,最终要的就是date格式,多此一举了。

@Test
		public void calendar(){
			Date currentDate= new Date();//输出:Wed Jun 07 15:40:14 CST 2017
			System.out.println(currentDate);
			try {
				SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
				Date date = DateFormat.getDateTimeInstance().parse(sdf.format(currentDate));
				System.out.println(date);//输出:Wed Jun 07 15:40:14 CST 2017
			} catch (ParseException e) {
				e.printStackTrace();
			}
			
		}

正文:在项目中经常会从前端传过来String类型的格式的日期,这个时候需要我们后台接收后进行转换一下。

一、String————>Date

1)带有时分秒的(年月日时分秒)

@Test
public void calendar(){
	// String转换为Date  
	String dateStr="2017-06-07 23:23:23";  
	String pattern="yyyy-MM-dd HH:mm:ss";  
	SimpleDateFormat dateFormat=new SimpleDateFormat(pattern);  
	try {
		Date date=dateFormat.parse(dateStr);
		System.out.println(date);//输出:Wed Jun 07 23:23:23 CST 2017
	} catch (ParseException e) {
		e.printStackTrace();
	}  
}
其中:String pattern="yyyy-MM-dd HH:mm:ss";  
   SimpleDateFormat dateFormat=new SimpleDateFormat(pattern);  
  可以合并成: SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  

2)不带时分秒的(仅有年月日的)

@Test
public void calendar(){
	// String转换为Date  
	String dateString = "2017-06-07 ";  
	try{  
	    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd ");  
	    Date date = sdf.parse(dateString); 
	    System.out.println(date);//输出:Wed Jun 07 00:00:00 CST 2017
	}catch (ParseException e){  
	    e.getMessage();  
	} 
}

3)将带有时分秒的String 格式化成不带时分秒的Date

@Test
public void calendar3(){
	// String转换为Date  
	String dateStr="2017-06-07 23:23:23";  
	String pattern="yyyy-MM-dd";  
	SimpleDateFormat dateFormat=new SimpleDateFormat(pattern);  
	try {
		Date date=dateFormat.parse(dateStr);
		System.out.println(date);//输出:Wed Jun 07 00:00:00 CST 2017
	} catch (ParseException e) {
		e.printStackTrace();
	}  
}

考虑:若只转换时分秒呢?答案是从1970年开始的年份加秒数

@Test
public void calendar(){
	// String转换为Date  
	String dateString = "23:24:59";  
	try{  
	    SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");  
	    Date date = sdf.parse(dateString); 
	    System.out.println(date);//输出:Thu Jan 01 23:24:59 CST 1970
	}catch (ParseException e){  
	    e.getMessage();  
	} 
}

二、Date转String 

Date——>String

1)带时分秒的格式
@Test
public void calendar(){
	// Date 转换为String  
	Date ddate = new Date();//从数据库取出来的也一样
	String sdate=(new SimpleDateFormat("yyyy-MM-dd")).format(ddate);  
	System.out.println(sdate);//2017-06-07 16:14:17
}
2)不带时分秒的只需将格式替换成"yyyy-MM-dd"即可。

Date转Date (这种的是指带有时分秒的date转成不带时分秒的Date)
Date——>Date
思路:可以先将date转成String 在将String转成不带时分秒的date
@Test
public void calendar3(){
	// Date 转换为String  
	Date ddate = new Date();
	String sdate=(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(ddate);  
	System.out.println(sdate);//2017-06-07 16:14:17
	
	// String转换为Date  
	String pattern="yyyy-MM-dd";  
	SimpleDateFormat dateFormat=new SimpleDateFormat(pattern);  
	try {
		Date date=dateFormat.parse(sdate);
		System.out.println(date);//输出:Wed Jun 07 00:00:00 CST 2017
	} catch (ParseException e) {
		e.printStackTrace();
	}  
}
也可以先将Date转成不带时分秒的String 在将String转成不带时分秒的date,这里就不做演示了

2 Java.sql.Date(略)

包含年、月、日信息。

继承自Java.util.Date。在数据库相关操作中使用,如rs.getDate,ps.setDate等。rs是指ResultSet,ps是指PreparedStatement。

// java.util.Date转换为java.sql.Date  
new java.sql.Date(utilDate.getTime());// 其中utilDate为java.util.Date类型的对象  

3 Java.util.Calendar

包含年、月、日、时、分、秒、毫秒信息。

JDK1.1引入,用以代替java.util.Date。

一、Date类型转换成Calendar 

Date——>Calendar

1)带时分秒的格式

@Test
public void calendar(){
	// Date转为Calendar  
	Date date=new Date();  
	Calendar calendar=Calendar.getInstance();  
	calendar.setTime(date);  
	System.out.println(calendar);
}

打印输出的格式为:java.util.GregorianCalendar[time=1496823744368,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2017,MONTH=5,WEEK_OF_YEAR=23,WEEK_OF_MONTH=2,DAY_OF_MONTH=7,DAY_OF_YEAR=158,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=1,AM_PM=1,HOUR=4,HOUR_OF_DAY=16,MINUTE=22,SECOND=24,MILLISECOND=368,ZONE_OFFSET=28800000,DST_OFFSET=0]

此时只需要将claendar对象传递给调用者就可。

2)不带时分秒的格式

@Test
public void calendar3(){
	// Date 转换为String  
	Date ddate = new Date();
	String sdate=(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(ddate);  
	System.out.println(sdate);//2017-06-07 16:14:17
	
	// String转换为Date  
	Date date = null;
	SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd");  
	try {
		date=dateFormat.parse(sdate);
		System.out.println(date);//输出:Wed Jun 07 00:00:00 CST 2017
	} catch (ParseException e) {
		e.printStackTrace();
	} 
	
	Calendar calendar=Calendar.getInstance();  
	calendar.setTime(date);  
	System.out.println(calendar);
}
其中calendar的输出是:java.util.GregorianCalendar[time=1496764800000,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2017,MONTH=5,WEEK_OF_YEAR=23,WEEK_OF_MONTH=2,DAY_OF_MONTH=7,DAY_OF_YEAR=158,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=0,ZONE_OFFSET=28800000,DST_OFFSET=0]

若:从数据库中取出来的date本身就不带时分秒的话会跟简单,将上边的date转换去掉即可,原理同带时分秒的转换。

二、calendar 转date

@Test
public void calendar3(){
	Date date = new Date();
	//date 转calendar
	Calendar calendar = Calendar.getInstance();
	calendar.setTime(date);
	System.out.println(calendar);
	//得到calendar 转 date
	Date ddate=calendar.getTime();
	System.out.println(ddate);
}
calendar 转String可以借助date类型进行相互转换。

其它时间格式的转换现在不介绍,如有需求后期在补充。

你可能感兴趣的:(java)