IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

[Java基础教程]第九章-Java日期处理

孙豪杰的博客 2016-02-21 22:40:23 累计浏览 2,560 次
本机暂存

中国古代是否有自己的历法是朝代是否确立的标志之一,可见日期时间对人们生活的重要性,在计算机中日期和时间仍然占有非常重要的地位。Java中日期是以1970-01-01 08::00:00为基准,其他时间为这个基准的相加(或者相减)的毫秒数。获取当前时间的毫秒数,可以使用“System.currentTimeMillis()"。为了方便使用JDK提供了一个日期时间类java.lang.Date,直接new Date(),也可以获取当前时间。

System.out.println(System.currentTimeMillis());
System.out.println(newDate().getTime());  

上面的代码执行时可能存在下面的输出比上面的输出大,是因为执行时时间已经变更,Date的getTime()方法会返回该时间的long型表示的值,如果不调用这个方法,会输出为"Mon Feb 01 22:34:06 CST 2016"(这个是当前时间的值)的格式。任何类都会继承Object方法,其中会实现toString(),方法,对象直接打印时会调用toString()方法,这点后面我们会有一章主讲这块,这里先了解一下,Date的toString就是把时间输出为这种格式。这种方式可能美国人更熟悉,对于中国人不太直观,那么怎么输出我们熟悉的格式呢?

jdk为格式化Date提供了一个工具类java.text.DateFormat,这是一个抽象类,最常用的子类为java.text.SimpleDateFormat,我们把当前时间输出为"2016-02-01 23:27:72"的格式,代码如下:

DateFormat dateFormat = newSimpleDateFormat("yyyy-MM-dd HH:mm:SS");
Date curDate = newDate();
System.out.println(dateFormat.format(curDate));  

jdk的把年月日以及各种时间输出的方式使用字母表示具体的格式,比如年使用"yyyy",月使用"MM",具体的对应关系如下表:
字母 日期或时间元素 表示 示例

字母日期或时间元素表示示例
GEra 标志符TextAD
yYear1996; 96
M年中的月份MonthJuly; Jul; 07
w年中的周数Number27
W月份中的周数Number2
D年中的天数Number189
d月份中的天数Number10
F月份中的星期Number2
E星期中的天数TextTuesday; Tue
aAm/pm 标记TextPM
H一天中的小时数(0-23)Number0
k一天中的小时数(1-24)Number24
Kam/pm 中的小时数(0-11)Number0
ham/pm 中的小时数(1-12)Number12
m小时中的分钟数Number30
s分钟中的秒数Number55
S毫秒数Number978
z时区General time zonePacific Standard Time; PST; GMT-08:00
Z时区RFC 822 time zone-0800

Date类也存在接收入参的构造方法,比如"Date curDate2 = new Date(System.currentTimeMillis());"同样可以获取当前时间,前面我们提到时间是以1970-01-01 08::00:00为基准的long型存储的,我们在初始化Date时,传入0值,看下会输出的是不是"1970-01-01 08::00:00",代码如下:

Date date1970 = newDate(0);
System.out.println(dateFormat.format(date1970));  

工作中,日期的变化改变也是一个比较常用的功能。比如今天是2016-02-01是一个纪念日,那么2017-02-01我需要收到一个提醒,所以我们需要把时间调整为2017年的此刻,然后再进行一些其他的操作。我们可以采用字符串转换为日期的方式,比如:

Date date2017 = dateFormat.parse("2017-02-01 23:27:72");
System.out.println(date2017);  

这种方式要求我们必须确定的日期才能处理,使用起来不太方便,为了更方便处理时间变更,jdk提供了更优雅的方式Calendar日历。

Calendar calendar = Calendar.getInstance();
calendar.setTime(curDate2);
intcurYear = calendar.get(Calendar.YEAR);
calendar.set(Calendar.YEAR, curYear + 1);
System.out.println(dateFormat.format(calendar.getTime())); 

setTime为Calendar对象设置一个时间,get(int)获取int表示的值, set(int, int)设置第一个入参表示的类型的值为第二个入参,比如"calendar.set(Calendar.YEAR, curYear + 1)"设置calendar的年为当前时间的年+1, getTime获取时间。get和set可以处理的类型在Calendar有常量定义,大家可以在Calendar的源码中查看。

小练习:
打印出从1000年到2000年中哪些是闰年。

packagecom.sunhaojie.learntest.ninth;
 
importjava.text.DateFormat;
importjava.text.ParseException;
importjava.text.SimpleDateFormat;
importjava.util.Calendar;
importjava.util.Date;
 
/**
 * 
 * @ClassName DateTest
 * @Description 日期测试类
 *
 * @author sunhaojie 3113751575@qq.com
 * @date 2016年2月1日 下午11:24:31
 */
publicclassDateTest {
 
    /**
     * 
     * @Title main
     * @Description 日期测试
     * @param args
     * @return void
     *
     * @author sunhaojie 3113751575@qq.com
     * @throws ParseException
     * @date 2016年2月1日 下午10:19:27
     */
    publicstaticvoidmain(String[] args) throwsParseException {
        System.out.println(System.currentTimeMillis());
        System.out.println(newDate().getTime());
        System.out.println(newDate());
 
        DateFormat dateFormat = newSimpleDateFormat("yyyy-MM-dd HH:mm:SS");
        Date curDate = newDate();
        System.out.println(dateFormat.format(curDate));
 
        Date curDate2 = newDate(System.currentTimeMillis());
        System.out.println(dateFormat.format(curDate2));
 
        Date date1970 = newDate(0);
        System.out.println(dateFormat.format(date1970));
 
        Date date2017 = dateFormat.parse("2017-02-01 23:27:72");
        System.out.println(date2017);
 
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(curDate2);
        intcurYear = calendar.get(Calendar.YEAR);
        calendar.set(Calendar.YEAR, curYear + 1);
        System.out.println(dateFormat.format(calendar.getTime()));
    }
 
}

同分类推荐文章

  1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. SmartSprites - 命令行形式的CSS Sprites生成器 (累计阅读 123,894)
  2. Java开发岗位面试题归类汇总 (累计阅读 22,155)
  3. android 开发入门 (累计阅读 19,527)
  4. 我的PHP,Python和Ruby之路 (累计阅读 13,146)
  5. HashMap解决hash冲突的方法 (累计阅读 12,652)
  6. 一个大二学生有关如何成为一名软件工程师的疑问及答复 (累计阅读 9,178)
  7. Java程序员应该知道的10个eclipse调试技巧 (累计阅读 8,011)
  8. 如何让员工忠于公司? (累计阅读 7,938)
  9. Java技术路线 (累计阅读 7,725)
  10. 聊聊ThoughtWorks面试 (累计阅读 7,614)