Date和SimpleDateFormat

本文介绍了Java中处理日期的Date类及其过时问题,强调了不推荐使用过时方法的原因。接着详细讲解了如何创建Date对象以及其常用方法。随后,重点介绍了SimpleDateFormat类,用于日期的解析和格式化,包括创建对象、自定义格式说明以及实例应用,如计算存活时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.日期类Date

1.1概述

Java提供了Date类来处理日期、时间,Date对象既包含日期,也包含时间。该类从JDK 1.0起就开始存在了,但正因为它历史悠久,所以它的大部分构造器、方法都已经过时,不再推荐使用了。

过时(Deprecated)是指:Java不再推荐使用,如果非要使用不再推荐的构造器或方法,编译器会提出警告信息,并可能会导致程序性能、安全性等方面的问题 。

1.2创建对象

Date类提供了6个构造器,其中4个已经过时,剩下的两个构造器来实例化Date对象。

Date() 
  //无参构造,使用当前日期和时间来初始化Date对象,即Date对象包含的是当前日期时间
  //底层调用System.currentTimeMillis()获得long整数作为日期参数。
Date( long milliSec ) 
  //接收从1970年1月1日0:0:0 GMT起的毫秒数来初始化Date对象,即Date包含的是: 1970年1月1日0:0:0加上毫秒数后的日期时间
  //其他构造方法已过时

开发时使用Date类要导包,注意是 java.util.Date,不是java.sql.Date。
在这里插入图片描述
创建日期对象示例:

public static void main(String[] args) {
  Date d = new Date( ); //创建包含当前日期时间的Date对象
  Date d2 = new Date( 1000 * 60 * 60 ); //创建包含指定毫秒值的Date对象
  System.out.println( d ); //Thu Mar 18 16:22:13 CST 2021
  System.out.println( d2 ); //Thu Jan 01 09:00:00 CST 1970
  System.out.println( d2.getTime() ); //获取从1970年1月1日起的毫秒值
}

1.3常用方法

long getTime()//返回从1970年1月1日 00:00:00 GMT 到该Date对象之间的时间差,以毫秒作为单位
void setTime( long milliSec )//设置此 Date对象 从 1970年1月1日00:00:00 GMT 的毫秒值。
?
int compareTo(Date anotherDate)//比较当前日期时间 和 参数中表示的日期时间的先后顺序
  //如果 [当前日期] 比 [参数中的日期] 早, 返回 -1;
  //如果 [当前日期] 比 [参数中的日期] 晚, 返回 1;
  //如果 [当前日期] 和 [参数中的日期] 相同, 返回 0;
  
int getYear()//获取此Date对象中包含的年份,已过时,不建议使用
int getMonth()//获取此Date对象中包含的月份,已过时,不建议使用
int getHours()//获取此Date对象中包含的月份,已过时,不建议使用
  //......

测试上述方法:

public static void main(String[] args) {
  //测试setTime和getTime方法
  Date d3 = new Date(  );
  System.out.println( d3 ); //Thu Mar 18 16:43:50 CST 2021
  System.out.println( d3.getTime() ); //1616057030304
  
  d3.setTime( 1000 * 60 * 60 );
  System.out.println( d3 ); //Thu Jan 01 09:00:00 CST 1970
  System.out.println( d3.getTime() ); //3600000
  
  System.out.println( "-----------------------" );
  
  //测试compareTo方法
  Date d4 = new Date( 1000 * 60 * 60 );
  Date d5 = new Date( 2000 * 60 * 60 );
  System.out.println( d4.compareTo( d5 ) ); //-1
  System.out.println( d5.compareTo( d4 ) ); //1
  System.out.println( d5.compareTo( d5 ) ); //0
  
  //下面过时的方法直接忽略即可,不需要掌握
  System.out.println( d4.getYear() ); //70,年份后两位
  System.out.println( d4.getMonth() ); //0,月份从1开始
  System.out.println( d4.getHours() ); //10
}

2.SimpleDateFormat

2.1概述

SimpleDateFormat是一个用于日期解析与格式化的类

它可以将Date对象格式化成字符串,也可以将日期字符串解析成Date对象。

2.2创建对象

SimpleDateFormat() 
  //用默认的模式和默认语言环境的日期格式符号构造 SimpleDateFormat。
SimpleDateFormat(String pattern) 
  //用给定的模式和默认语言环境的日期格式符号构造 SimpleDateFormat

代码示例:

//创建默认格式和符号的SimpleDateFormat实例
SimpleDateFormat sdf = new SimpleDateFormat();
?
//创建指定格式和符号的SimpleDateFormat实例
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

其中 “yyyy-MM-dd HH:mm:ss” 是自定义的日期时间转换格式,每个字母的作用如下:

y: 表示年份,yyyy则表示年份为4位,如: 2020年
M: 表示月份,MM则表示月份为两位,如: 03月
d: 一个月中的日期,dd则表示天数为两位,如:21号
H: 一天中的小时, H是24小时制, h是12小时制
m: 分钟数
s: 秒数
S: 毫秒数
E: 星期几
...

2.3常用方法

String format(Date date) 
  //按照一定的模式 将一个Date对象格式化为日期/时间字符串。 
?
Date parse(String source) 
  //按照一定的模式,将一个字符串解析成一个Date对象。 
public static void main(String[] args) throws Exception {
  
  //1.将当前日期时间按下面的格式, 转成一个字符串
  SimpleDateFormat sdf3 = 
    new SimpleDateFormat( "yyyy/MM/dd HH:mm:ss" );
  Date d2 = new Date();
  System.out.println( sdf3.format( d2 ) );//2021/03/18 23:48:40
  
  //2.将下面的日期时间字符串, 解析成一个Date对象
  String dateStr = "2020年12月24日 13时25分39秒";
  SimpleDateFormat sdf4 = 
    new SimpleDateFormat( "yyyy年MM月dd日 HH时mm分ss秒" );
  System.out.println( sdf4.parse( dateStr ) ); 
    //Thu Dec 24 13:25:39 CST 2020
}

2.4案例:计算存活时间

根据用户输入的出生日期,计算用户的存活时间

实现思路:

1)定义日期格式化对象(比如:时间格式为:yyyy/MM/dd)
2)提示用户按照指定的格式输入出生年月日,并接收
3)将该用户输入的年月日字符串 转成Date对象
4)获取该用户从 197011日 到 用户出生时 的时间毫秒值
5)获取该用户从 197011日 到 此时此刻 的时间毫秒值
6)计算该用户一共所存活的时间毫秒值(begin-end)
7)计算用户存活的时间

代码示例:

public static void main(String[] args) throws Exception {
  //定义日期格式化对象(比如:时间格式为:yyyy/MM/dd)
  String pattern = "yyyy/MM/dd";
  SimpleDateFormat sdf = new SimpleDateFormat( pattern );
?
  //提示用户按照指定的格式输入出生年月日,并接收
  System.out.println( "请输入您的出生年月日, 以"+pattern+"隔开:" );
  String birthStr = new Scanner(System.in).nextLine();
?
  //将该用户输入的年月日字符串 转成Date对象
  Date birth = sdf.parse( birthStr );
  //获取该用户从 1970年1月1日 到 用户出生时 的时间毫秒值
  long begin = birth.getTime();
  //获取该用户从 1970年1月1日 到 此时此刻 的时间毫秒值
  long now = System.currentTimeMillis();
  //计算该用户一共所存活的时间毫秒值
  long total = now - begin;
  
  //计算该用户一共活了多少年
  int year = (int) (total / ( 1000L*60*60*24*365) );
  //计算该用户一共活了多少天
  int day = (int) (total / ( 1000L*60*60*24 ) );
  //计算该用户一共活了多少小时
  int hour = (int)( total / ( 1000*60*60 ) );
  //计算该用户一共活了多少分钟
  int minute = (int) ( total / ( 1000*60 ) );
  
  System.out.println( "您一共存活了:[ "+year+" ]年" );
  System.out.println( "您一共存活了:[ "+day+" ]天" );
  System.out.println( "您一共存活了:[ "+hour+" ]小时" );
  System.out.println( "您一共存活了:[ "+minute+" ]分钟" );
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值