在08年的项目中经常遇到Calendar(日历)的转化错误,这个错误在Windows环境中不会抛错,将项目部署到Linux中就会抛异常导致功能无法使用,这里做一个总结。
包含年、月、日、时、分、秒信息。
格式: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();
}
}
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";
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();
}
}
@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
}
@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,这里就不做演示了
包含年、月、日信息。
继承自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类型的对象
包含年、月、日、时、分、秒、毫秒信息。
JDK1.1引入,用以代替java.util.Date。
Date——>Calendar
1)带时分秒的格式
@Test
public void calendar(){
// Date转为Calendar
Date date=new Date();
Calendar calendar=Calendar.getInstance();
calendar.setTime(date);
System.out.println(calendar);
}
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转换去掉即可,原理同带时分秒的转换。
@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类型进行相互转换。
其它时间格式的转换现在不介绍,如有需求后期在补充。