引言:
java在JDK8之前就提供了一些较为常用的关于时间的API。
一、java.lang.System 类
System类提供的 public static long currentTimeMillis() 用来返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。此方法适于计算时间差。
计算世界时间的主要标准有:
UTC(Coordinated Universal Time)
GMT(Greenwich Mean Time)
CST(Central Standard Time)
二、java.util.Date 类
表示特定的瞬间,精确到毫秒
- 构造器:
- Date():使用无参构造器创建的对象可以获取本地当前时间。即,创建一个对应当前时间的Date对象
- Date(long date):创建指定毫秒数的Date对象
- 常用方法
- getTime():获取当前Date对象对应的毫秒数。(时间戳)
- toString():把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy 其中: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat),zzz是时间标准。即,显示当前的年、月、日、时、分、秒
- 其它很多方法都过时了。
- java.sql.Date对应着数据库中的日期类型的变量。且java.sql.Date是java.util.Date的子类。
import org.junit.Test;
import java.util.Date;
public class DateTimeTest {
/*Date类测试*/
@Test
public void test2() {
//构造器一:Date()创建一个对应当前时间的Date对象
Date date1 = new Date();
System.out.println(date1);//Fri Jan 08 15:52:29 CST 2021
System.out.println(date1.getTime());//获取当前Date对象对应的毫秒数。(时间戳)
//构造器二:创建指定毫秒数的Date对象
Date date2 = new Date(155030620410L);
System.out.println(date2.toString());//Sat Nov 30 16:03:40 CST 1974
//创建java.sql.Date对象
java.sql.Date date3 = new java.sql.Date(35235325345L);
System.out.println(date3);//1971-02-13
//java.util.Date对象 与 java.sql.Date对象 的互转
Date date4 = new Date();
java.sql.Date date5 = new java.sql.Date(date4.getTime());
Date date6 = new java.sql.Date(73193271938712L);//多态
}
/*System.currentTimeMillis()测试*/
@Test
public void test1() {
long time = System.currentTimeMillis();
//返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。常常称其为 时间戳
System.out.println(time);
}
}
三、java.text.SimpleDateFormat 类
Date类的API不易于国际化,大部分被废弃了,java.text.SimpleDateFormat 类是一个不与语言环境有关的方式来格式化和解析日期的具体类。SimpleDateFormat是对日期Date类的格式化和解析
- 它允许进行格式化:日期–>字符串、解析:字符串–>日期
- 格式化:
- SimpleDateFormat() :默认的模式和语言环境创建对象
- public SimpleDateFormat(String pattern):该构造方法可以用参数pattern指定的格式创建一个对象,该对象调用:public String format(Date date):方法格式化时间对象date
- 解析:
- public Date parse(String source):从给定字符串的开始解析文本,以生成一个日期。
public class DateTimeTest {
@Test
public void testSimpleDateFormat() throws ParseException {
//实例化SimpleDateFomat:使用默认构造器
SimpleDateFormat sdf = new SimpleDateFormat();
//格式化:日期 --> 字符串
Date date = new Date();
System.out.println(date);
String format = sdf.format(date);
System.out.println(format);
//解析:字符串 --> 日期
String str = "2021-1-8 下午19:16";//要求字符串必须是符合SimpleDateFormat识别的格式(通过构造器参数体现),否则,抛异常
Date date1 = sdf.parse(str);
System.out.println(date1);
//*************按照指定的方式格式化和解析:调用带参的构造器*****************
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
//格式化
String format1 = sdf1.format(date);
System.out.println(format1);
//解析:要求字符串必须是符合SimpleDateFormat识别的格式(通过构造器参数体现),否则,抛异常
Date date2 = sdf1.parse(format1);
System.out.println(date2);
}
/**
* 练习一:字符串"2020-09-08"转换为java.sql.Date
*/
@Test
public void testExer() throws ParseException {
String birth = "2020-09-08";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = sdf.parse(birth);
java.sql.Date birthDate = new java.sql.Date(date.getTime());
System.out.println(birthDate);
}
/**
* 练习二:"三天打渔两天晒网" 1990-01-01 xxxx-xx-xx 打渔?晒网?
* 举例:2020-09-08 ? 总天数
* 总天数 % 5 == 1,2,3 : 打渔
* 总天数 % 5 == 4,0 : 晒网
* 总天数的计算?
* 方式一:( date2.getTime() - date1.getTime()) / (1000 * 60 * 60 * 24) + 1
* 方式二:1990-01-01 --> 2019-12-31 + 2020-01-01 -->2020-09-08
*/
@Test
public void testExer1() throws ParseException {
String startDay = "1990-01-01";
String endDay = "2020-01-08";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date1 = sdf.parse(startDay);
Date date2 = sdf.parse(endDay);
long day = (date2.getTime() - date1.getTime()) / (24 * 60 * 60 * 1000) + 1;
String result = (day % 5 < 3) ? "打渔" : "嗮网";
System.out.println(result);
}
}
四、java.util.Calendar(日历)类
Calendar是一个抽象基类,主用用于完成日期字段之间相互操作的功能。
- 获取Calendar实例的方法
- 使用Calendar.getInstance()方法
- 调用它的子类GregorianCalendar的构造器。
- 一个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)
- 注意:
- 获取月份时:一月是0,二月是1,以此类推,12月是11
- 获取星期时:周日是1,周二是2 , 。。。。周六是7
public class DateTimeTest {
@Test
public void testCalendar() {
//1. 实例化
//方式一:创建其子类 GregorianCalendar 的对象
//方式二:调用其静态方法getInstance()
Calendar calendar = Calendar.getInstance();
System.out.println(calendar.getClass());//class java.util.GregorianCalendar
//2. 常用方法
//get()
int days = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days);
System.out.println(calendar.get(Calendar.DAY_OF_YEAR));
//set()
//calendar可变性
calendar.set(Calendar.DAY_OF_MONTH, 22);//返回值为void,改变本身的值
days = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days);
//add()
calendar.add(Calendar.DAY_OF_MONTH,-3);//可为负数
days = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days);
//getTime():日历类---> Date
Date date = calendar.getTime();
System.out.println(date);
//setTime():Date ---> 日历类
Date date1 = new Date();
calendar.setTime(date1);
days = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days);
}
}