本篇文章主要摘录了4篇文章的内容,原文在文末
在java中时间类主要有Date、Calendar、SimpleDateFormat
,暂时只介绍 java.util.*
下的时间类,对于java.sql.下的先不做介绍,文章比较长可以根据自己的需要看对应的内容。
目录:
一、Date类
1.使用Date类代表当前系统时间
2.使用Date类代表指定时间
3.获取Date对象中的信息(年月日周)
二、Calendar类
1.使用Calendar类代表当前时间
2.使用Calendar类代表指定的时间
1)指定日期中,年月日
2)指定日期年月日,中某个日期
3.Calendar类常用方法
案例:
三、SimpleDateFormat类
1.String 类型转化成Date
2.Date类型转化成为String
3.其它日期格式
四、后记
一、Date类
在JDK1.0中,Date类是唯一的一个代表时间的类,但是由于Date类不便于实现国际化,所以从JDK1.1版本开始,推荐使用Calendar类进行时间和日期处理。这里简单介绍一下Date类的使用。
Date
类中很多方法已经过时,使用Calendar
来替代。
常用方法有,
long getTime() //返回的时间是距离1970年的毫秒数
void setTime(long time)
1.使用Date类代表当前系统时间
//创建一个代表系统当前日期的Date对象
Date now = new Date();
System.out.println(date);
//Wed Dec 29 15:38:51 CST 2021
使用Date类的默认构造方法创建出来的对象就代表当前的时间,由于Date类覆盖了toString()方法。所以可以直接输出Date类型的对象,显示的结果如下:Wed Dec 29 15:38:51 CST 2021
2.使用Date类代表指定时间
使用带参数的构造方法 Date(int year, int month, int day)
,可以构造指定日期
的Date类对象,Date类中年份的参数应该是实际需要代表的年份减去
1900,月份参数应该是实际需要代表的月份减去1
以后的值。
//创建一个代表2021年6月12号的Date对象
Date d1 = new Date(2021-1900, 6-1, 12);
3.获取Date对象中的信息(年月日周)
如:
Date d2 = new Date(2014-1900, 6-1, 12);
//获得年份 (注意年份要加上1900,这样才是日期对象d2所代表的年份)
int year = d2.getYear() + 1900;
//获得月份 (注意月份要加1,这样才是日期对象d2所代表的月份)
int month = d2.getMonth() + 1;
//获得日期
int date = d2.getDate();
//获得小时
int hour = d2.getHours();//不设置默认为0
//获得分钟
int minute = d2.getMinutes();
//获得秒
int second = d2.getSeconds();
//获得星期 (注意:0代表星期日、1代表星期1、2代表星期2,其他的一次类推了)
int day = d2.getDay();
使用Date类中的get
方法。需要注意的是使用getYear
获得的是Date对象中年份减去1900以后的值,所以需要显示对应的年份则需要在返回值的基础上加1900,月份类似。在Date类中还提供了getDay
方法,用于获得Date对象代表的时间是星期几,Date
类规定周日是0,周一是1,周二是2,后续的依次类推。
二、Calendar类
从JDK1.1版本开始,在处理日期和时间时,系统推荐使用Calendar类进行实现(Date的一些方法都过时了)。在设计上,Calendar类的功能要比Date类强大很多,而且在实现方式上也比Date类要复杂一些,下面就介绍一下Calendar类的使用。
Calender类是一个抽象类,在实际使用时实现特定的子类的对象,使用getInstance()
方法创建即可。
1.使用Calendar类代表当前时间
Calendar c = Calendar.getInstance();
System.out.println(c);
//结果:
//java.util.GregorianCalendar[time=1640766764310,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=2021,MONTH=11,WEEK_OF_YEAR=1,WEEK_OF_MONTH=5,DAY_OF_MONTH=29,DAY_OF_YEAR=363,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=5,AM_PM=1,HOUR=4,HOUR_OF_DAY=16,MINUTE=32,SECOND=44,MILLISECOND=310,ZONE_OFFSET=28800000,DST_OFFSET=0]
返回的是一个Calendar对象,由于Calendar类是抽象类,且Calendar类的构造方法是protected的,所以无法使用Calendar类的构造方法来创建对象,API中提供了getInstance方法用来创建对象。
使用该方法获得的Calendar对象就代表当前的系统时间,由于Calendar类toString实现的没有Date类那么直观,所以直接输出Calendar类的对象意义不大。
2.使用Calendar类代表指定的时间
1)指定日期中,年月日
//获取获取系统的当前日历对象
Calendar c1 = Calendar.getInstance();
c1.set(2021,8-1,28);
使用过Calendar类代表特定的时间,需要首先创建一个Calendar的对象,然后在设定该对象中的年月日参数来完成。set方法的声明为:public final void set(int year,int month,int date)
以上示例代码设置的时间为2021年8月28日
,其参数的结构和Date类不一样。Calendar类中年份的数值直接书写,月份的值为实际的月份值减1
,日期的值就是实际的日期值。
备注:看见另外一种方法指定日期:
Calendar current = Calendar.getInstance();
String strTime = "2000-03-05";
Date date = new SimpleDateFormat("yyyy-MM-dd").parse(strTime);
current.setTime(date);//将时间对象data设置为新的日历
System.out.println("修改后的系统时间为:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS").format(current.getTime()));
2)指定日期年月日,中某个日期
如果只设定某个字段某个字段,例如日期的值,则可以使用如下set方法:
public void set(int field,int value)
,在该方法中,参数field代表要设置的字段的类型,常见类型如下:
Calendar.YEAR | 年份 |
Calendar.MONTH | 月份; |
Calendar.DATE | 日期;当月的第几天 |
Calendar.DAY_OF_MONTH | 日期,和Calendar.DATE字段完全相同; |
Calendar.HOUR | 12小时制的小时数; |
Calendar.HOUR_OF_DAY | 24小时制的小时数; |
Calendar.MINUTE | 分钟; |
Calendar.SECOND | 秒; |
Calendar.DAY_OF_WEEK | 星期几。 |
Calendar c1 = Calendar.getInstance();
System.out.println(c1.get(Calendar.YEAR) + "-" + c1.get(Calendar.MONTH) + "-" + c1.get(Calendar.DATE));
//2021-11-29
c1.set(Calendar.DATE,10);
System.out.println("日期设置为10号后:" + c1.get(Calendar.YEAR) + "-" + c1.get(Calendar.MONTH) + "-" + c1.get(Calendar.DATE));
//日期设置为10号后:2021-11-10
该代码的作用是将c1对象代表的时间中日期设置为10号,其它所有的数值会被重新计算,例如星期几以及对应的相对时间数值等。
3.Calendar类常用方法
方法 | 作用 |
---|---|
static Calendar getInstance() | 使用默认时区和区域设置获取日历。通过该方法生成Calendar对象。如下所示:Calendar cr=Calendar.getInstance(); |
public void set(int year,int month,int date,int hourofday,int minute,int second) | 设置日历的年、月、日、时、分、秒。 |
public int get(int field) | 返回给定日历字段的值。所谓字段就是年、月、日等等。 |
public void setTime(Date date) | 使用给定的Date设置此日历的时间。Date------Calendar,重新设置时间 |
public Date getTime() | 返回一个Date表示此日历的时间。Calendar-----Date,格式:Sat Sep 08 10:10:10 CST 2012,返回一个Date时间 |
abstract void add(int field,int amount) | 该方法的作用是在Calendar对象中的某个字段上增加或减少一定的数值,增加是amount的值为正,减少是amount的值为负。如下所示:Calendar c3 = Calendar.getInstance();c3.add(Calendar.DATE,100);--计算100天以后的时间 |
public long getTimeInMillis() | 以毫秒为单位返回该日历的时间值。返回毫秒值 |
案例:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class test {
public static void main(String[] args) throws ParseException {
//获 取获取系统的当前日历对象
Calendar current = Calendar.getInstance();
//1、获取今天是周几,在Calendar类中,周日是1,周一是2,周二是3,依次类推。
int weekDay = current.get(Calendar.DAY_OF_WEEK);
System.out.println("今天是周:" + (weekDay - 1));
//2、获取系统当前年
int year = current.get(Calendar.YEAR);
System.out.println("今年是:" + year + "年");
//3、获取系统当前月
int month = current.get(Calendar.MONTH);
System.out.println("本月是:" + (month + 1) + "月");
//4、获取系统当前日
int day = current.get(Calendar.DATE);
System.out.println("今天是" + day + "号");
//5、获取上午跟下午
int am_pm = current.get(Calendar.AM_PM);
if (am_pm == 0)
System.out.println("是上午");
else
System.out.println("是下午");
//6、获取当前的系统时间[date-->String]的过程
Date time = current.getTime();//获取的是当前系统的时间,Wed Dec 29 17:20:51 CST 2021
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
String showTime = format.format(time);
System.out.println("当前系统时间为:" + showTime);
//7、自定义日历的时间
String strTime = "2000-03-05";
Date date = new SimpleDateFormat("yyyy-MM-dd").parse(strTime);
current.setTime(date);//将时间对象data设置为新的日历
System.out.println("修改后的系统时间为:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS").format(current.getTime()));
}
}
在Calendar类中,周日是1,周一是2,周二是3,依次类推。
三、SimpleDateFormat类
SimpleDateFormat类可以实现java中日期格式的转化,将String类型的时间格式转化成Date类型或者将Date类型时间转化成为String类型
1.String 类型转化成Date
try {
String startTime = "2021-12-29";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date start = sdf.parse(startTime);
System.out.println(start);
//getTime():返回的时间是距离1970年的毫秒数.值不受setTime()的影响
System.out.println(start.getTime());
}catch (ParseException e){
e.printStackTrace();
}
- 这里要注意,传递进来的
startTime
是String类型的字符串,其格式必须和SimpleDateFormate
里面的参数形式一直,不是何格式的字符串都可以转化,要不会出现转发异常。 -
SimpDateFormat的parse()
方法,可能抛出ParseException
异常,需要异常处理
2.Date类型转化成为String
//获取系统当前时间
Date now=new Date();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd HH:mm");
System.out.println(sdf.format(now)); //2021/12/29 15:12
3.其它日期格式
SimpleDateFormat sdf0 =new SimpleDateFormat("Gyyyy年MM月dd日 HH时mm分ss秒");
//公元2021年12月29日 15时13分32秒
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy/MM/dd HH:mm");
//2021/12/29 15:13
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//2021-12-29 15:13:32
SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒 E ");
//2021年12月29日 15时13分32秒 星期三
SimpleDateFormat sdf4 = new SimpleDateFormat("yyyy/MM/dd E");
//2021/12/29 星期三
SimpleDateFormat sdf5 = new SimpleDateFormat("一年中的第 D 天 ,第w个星期 ,一个月中第W个星期 ,k时 z时区");
//一年中的第 363 天 ,第1个星期 ,一个月中第5个星期 ,15时 CST时区
SimpleDateFormat
日期-时间格式模式参数::
字母 | 对应日期或时间元素 | 表示 | 示例 |
---|---|---|---|
G | 年代标志符 | 标志符 | Text AD |
y | 年 | Year | 1996; 96 |
M | 年中的月份 | Month | July; Jul; 07 |
w | 年中的周数 | Number | 27 |
W | 月份中的周数 | Number | 2 |
D | 年中的天数 | Number | 189 |
d | 月份中的天数 | Number | 10 |
F | 月份中的星期 | Number | 2 |
E | 星期中的天数 | Text | Tuesday; Tue |
a | Am/pm 标记 | Text | PM |
H | 一天中的小时数(0-23) | Number | 0 |
k | 一天中的小时数(1-24) | Number | 24 |
K | am/pm 中的小时数(0-11) | Number | 0 |
h | am/pm 中的小时数(1-12) | Number | 12 |
m | 小时中的分钟数 | Number | 30 |
s | 分钟中的秒数 | Number | 55 |
S | 毫秒数 | Number | 978 |
z | 时区 | General time zone | Pacific Standard Time; PST; GMT-08:00 |
Z | 时区 | RFC 822 time zone | -0800 |
四、后记
最后:案例这里就不介绍了呀,上面的三个类Date、SimpleDateFormat、Calendar
理解到了,可以根据百度如何实现需求,在看别人的代码就可以看懂了,而不是懵的,只会复制黏贴。
其实java种的类很多方法很多,不是每个都要理解到、需要用的时候可以看懂就好。但是常用的还是要理解,比如时间类,因为工作中用到的就很多。数据就天天要使用到时间。
我还处于升级到第一步的过程中-----熟练
目前不怎么喜欢用语雀记笔记,因为笔记记多了,加载的时候很慢。看的时候觉得不是很方便
参考文章1:Java的Date类与Calendar类
参考文章2:java时间类Date、Calendar及用法(推荐)
参考文章3:java 中的Calendar常用方法(推荐)
参考文章4:java 日期相关Date、SimpleDateFormat、Calendar区分和使用