Java Time相关总结

Data 和DataTime

mysql数据库中存储格式
1.data:年月日

datatime:年月日 时分秒

2.data的数据格式是yyyy-mm-dd

datatime的数据格式是yyyy-mm-dd HH:MM:SS

java.util.Date java.sql.Date 的区别与转化

**共同点 :**都有getTime方法返回毫秒数,可以直接构建

不同点:

1、java.sql.Date是针对SQL语句使用的,它只包含日期而没有时间部分,一般在读写数据库的时候用,PreparedStament的setDate()的参数和ResultSet的getDate()方法的都是java.sql.Date
2、java.util.Date是在除了SQL语句的情况下面使用,一般是日常日期字段

3、java.util.Date 是 java.sql.Date 的父类,即:继承关系:java.lang.Object --》 java.util.Date --》 java.sql.Date

相互转化:

java.sql.Date 转为 java.util.Date

java.sql.Date date = new  java.sql.Date();
java.util.Date d = new java.util.Date(date.getTime());

java.util.Date 转为 java.sql.Date

java.util.Date utilDate = new Date();
java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());
java.sql.Time sTime = new java.sql.Time(utilDate.getTime());
java.sql.Timestamp stp = new java.sql.Timestamp(utilDate.getTime());

这里所有时间日期都可以被SimpleDateFormat格式化format()

SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
f.format(stp);
f.format(sTime);
f.format(sqlDate);
f.format(utilDate)

SimpleDataFormat

SimpleDateFormat 是一个以国别敏感的方式格式化和分析数据的具体类。 它允许格式化 (date -> text)、语法分析 (text -> date)和标准化。

SimpleDateFormat 允许以日期-时间格式化选择任何用户指定的方式启动。 但是,希望用 DateFormat 中的getTimeInstancegetDateInstancegetDateTimeInstance 创建一个日期-时间格式化程序。 每个类方法返回一个以缺省格式化方式初始化的日期/时间格式化程序。 可以根据需要用 applyPattern 方法修改格式化方式。

SimpleDateFormat函数的继承关系:

Java.lang.Object
 |
 ±—java.text.Format
 |
 ±—java.text.DateFormat
 |
 ±—java.text.SimpleDateFormat

下面是个小例子:

import java.text.*;
import java.util.Date;
/**
 SimpleDateFormat函数语法:
 G 年代标志符
 y 年
 M 月
 d 日
 h 时 在上午或下午 (1~12)
 H 时 在一天中 (0~23)
 m 分
 s 秒
 S 毫秒
 E 星期
 D 一年中的第几天
 F 一月中第几个星期几
 w 一年中第几个星期
 W 一月中第几个星期
 a 上午 / 下午 标记符 
 k 时 在一天中 (1~24)
 K 时 在上午或下午 (0~11)
 z 时区
 */
public class FormatDateTime {

  public static void main(String[] args) {
    SimpleDateFormat myFmt=new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
    SimpleDateFormat myFmt1=new SimpleDateFormat("yy/MM/dd HH:mm"); 
    SimpleDateFormat myFmt2=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//等价于now.toLocaleString()
    SimpleDateFormat myFmt3=new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒 E ");
    SimpleDateFormat myFmt4=new SimpleDateFormat(
        "一年中的第 D 天 一年中第w个星期 一月中第W个星期 在一天中k时 z时区");
    Date now=new Date();
    System.out.println(myFmt.format(now));
    System.out.println(myFmt1.format(now));
    System.out.println(myFmt2.format(now));
    System.out.println(myFmt3.format(now));
    System.out.println(myFmt4.format(now));
    System.out.println(now.toGMTString());
    System.out.println(now.toLocaleString());
    System.out.println(now.toString());
  }   
}

TimeStamp

要写一些与数据库连接时的日期处理,pstmt.setDate()的类型是java.sql.Date类型,这种符合规范的类型其实并没有把时分秒存进数据库,所以存取时就应该用setTimestamp()或getTimestamp()。

整理一:

1、往数据库里存日期数据

java.sql.Date 只存储日期数据不存储时间数据
// 会丢失时间数据
preparedStatement.setDate(1, new java.sql.Date(date.getTime()));
//可以这样来处理
preparedStatement.setTimestamp(1, new Timestamp(new java.util.Date().getTime()));

2、从数据库中取数据

//想要得到完整的数据,包括日期和时间,可以这样
java.util.Date d = resultSet.getTimestamp(1);
//这样处理更合适一些,可以避免一些潜在Timestamp 问题
java.util.Date d = new java.util.Date(resultSet.getTimestamp(1).getTime());

注:

往数据库存储的时候可以接收 java.util.Date类型 再用getTime()方法得到代表那个Date对象的long值,再以这个long值构造一个Timestamp对象 存进数据库中。

从数据库里取的时候,可以先得到Timestamp用他的getTime()方法得到long值,再以这个long值构造一个 java.util.Date对象,这样就可以对这个Date对象操作了。比如说 new SimpleDateFormat(“yyyyy-MM-dd HH:mm:ss”).format(Date)或format(Timestamp)都行~

整理二:

用Timestamp来记录日期时间还是很方便的,但有时候显示的时候是不需要小数位后面的毫秒的,这样就需要在转换为String时重新定义格式。

Timestamp转化为String:

SimpleDateFormat df = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);//定义格式,不显示毫秒
Timestamp now= newTimestamp(System.currentTimeMillis());//获取系统当前时间
String str = df.format(now);
String转化为Timestamp:
SimpleDateFormat df = new SimpleDateFormat(“yyyy-MM-ddHH:mm:ss”);
String time= df.format(newDate());
Timestamp ts= Timestamp.valueOf(time);

整理三:

在 ResultSet中我们经常使用的setDate或getDate的数据类型是java.sql.Date,而在平时java程序中我们一般习惯使用 java.util.Date。因此在DAO层我们经常会碰到这俩种数据类型的相互转换。

两者的关系

java.lang.Object
|
±–java.util.Date
|
±—java.sql.Date

相互转换

  1. 使用getTime()函数

这两个类都提供了getTime()函数,用于返回对应的毫秒数(long类型)。利用这个函数可以实现转换:

java.util.Date utilDate = new java.util.Date(sqlDate.getTime()); // sql -> util
java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime()); // util -> sql
  1. 使用SimpleDateFormat类实现转换
SimpleDateFormat 是一个以国别敏感的方式格式化和分析数据的具体类。 它允许格式化 (date -> text)、语法分析 (text -> date)和标准化。
SimpleDateFormat dateFormat = new SimpleDateFormate(“yyyy-MM-dd HH:mm:ss”);
java.util.Date utilDate = dateFormat.parse(sqlDate.toString());
  1. 直接转换

由于java.sql.Date是从java.util.Date中继承过来的,所以可以直接用: utilDate = sqlDate;

  1. 另类获得日期的方法:
SimpleDateFormat sy=new SimpleDateFormat(“yyyy”);
SimpleDateFormat sm=new SimpleDateFormat(“MM”);
SimpleDateFormat sd=new SimpleDateFormat(“dd”);
String syear=sy.format(date);
String smon=sm.format(date);
String sday=sd.format(date);

ps:1. java.util.Date类中的getYear()要加上1900才可得到实际值,getMonth()则要加上1。

2. 字符串到Date的转换: Date.valueOf(str),记得引包的时候要引sql的Date包,不是util的Date包

3. 字符串到Timestamp 的转换Timestamp ts = Timestamp.valueOf(time);

Java 日历类 Calendar

1.java.util.Calendar(日历)类
Calendar是一个抽象基类,主要用于完成日期字段之间相互操作的功能。也是说,常用来对于日期某个属性的相加或者相减,而不是用字符串拼接的方法。

获取Calendar实例的方法

使用Calendar.getInstance()方法,调用它的子类GregorianCalendar的构造器。
由于Calendar是抽象基类,所以不能用new的方式实现,只能用它的getInstance()方法。
一个Calendar的实例是系统时间的抽象表示,通过 get(int field) 方法来取得想要的时间信息。比如YEAR、MONTH、DAY_OF_WEEK、HOUR_OF_DAY 、MINUTE、SECOND,字段含义都基本可以见文知意。

public void set(int field,int value)
public void add(int field,int amount)
public final Date getTime()
public final void setTime(Date date)
demo
@Test
	public void test4() {
		Calendar c = Calendar.getInstance();
		int day = c.get(Calendar.DAY_OF_MONTH);
		System.out.println(day);//8
		c.add(Calendar.DAY_OF_MONTH, 2);	
      day = c.get(Calendar.DAY_OF_MONTH);
      System.out.println(day);//10
      c.set(Calendar.DAY_OF_MONTH, 23);
      Date d = c.getTime();
      System.out.println(d);
      }

	//例子二
	Calendar calendar = Calendar.getInstance();
        // 从一个 Calendar 对象中获取 Date 对象
        Date date = calendar.getTime();
        //使用给定的 Date 设置此 Calendar 的时间
        calendar.setTime(date);
        calendar.set(Calendar.DAY_OF_MONTH, 8);
        System.out.println("当前时间日设置为8后,时间是:" + calendar.getTime());
        calendar.add(Calendar.HOUR, 2);
        System.out.println("当前时间加2小时后,时间是:" + calendar.getTime());
        calendar.add(Calendar.MONTH, -2);
        System.out.println("当前日期减2个月后,时间是:" + calendar.getTime());
}

    /**
   * 判断是否进入预警时间
   * @param expirationTime
   * @param earlyWarningDay
   * @return true 预警
   */
  public boolean judgeTime(Timestamp expirationTime, Integer earlyWarningDay) {
      if(expirationTime == null){
          return false;
      }
      if(earlyWarningDay == null){
          return false;
      }
//        long expir = expirationTime.getTime();
//        long current = System.currentTimeMillis();
//        long warningTime = earlyWarningDay * 86400000L;
//        if(expir - current <= warningTime){
//            return true;
//        }
//        return false;
      Date expir = new java.util.Date(expirationTime.getTime());
      Date current = new java.util.Date(System.currentTimeMillis());
      Calendar cal = Calendar.getInstance();
      cal.setTime(expir);
      cal.add(Calendar.DATE, -earlyWarningDay);
      Date needExpir = cal.getTime();
      if(current.before(needExpir)){
          return false;
      }

      return true;
  }