在之前的文章我们介绍了一下 Java 中的包装类,本章我们来看一下 Java 中的日期操作。

在我们日常编程中,日期使我们非常常用的一个操作,比如读写日期,输出日志等,那接下来我们就看一下 Java 中的日期操作。

从上图可以看出 Java 为我们提供了三个标准类库来工我们使用,三个类库之间在使用过程中又需要相互协作,接下来我们就一一看一下。

Java中的时间

  1、Java 中的时间使用标准类库的 Date 类表示,是用距离一个固定时间点的毫秒数(可正可负,long 类型)表示一个特定的时间点;

  2、固定的时间点叫纪元(epoch),是 UTC 时间 1970年1月1日 00:00:00;

  3、UTC(Universal Time Coordinated 世界调整时间)与GMT(Greenwich Mean Time 格林威治时间)一样,是一种具有实际目的的科学标准时间。

 import java.util.Date;

 /**
* java.util.Date 包
* Date 的每一个实例用于表示一个确切的时间点。
* 内部维护了一个 long 值,该值记录的是从:
* 1970年1月1日 00:00:00 到表示的时间点之间所经历的毫秒值。
* 正数是 70 年以后的日期,负数是 70 年以前的日期
* 由于 Date 设计上存在缺陷(时区,千年虫),所以它的大部分方法被设置为"过时的",
* 不再建议使用
*/
public class Main {
public static void main(String[] args) {
// 当前系统时间
Date now = new Date();
System.out.println(now); // Wed Dec 11 15:57:21 CST 2019 --对非英语地区很不友好 /**
* Date 的大部分方法不建议使用了
* */
now.getYear(); // getYear 上面油条横线,表示方法已不再建议使用
/**
* 获取 Date 内部维护的 long 还可以使用
* */
long time = now.getTime();
System.out.println(time); //
/**
* void setTime(long)
* 设置一个 long 值,使 Date 表示该 long 值所表示的时间
* */
time += 24 * 60 * 60 * 1000; // 将 time 加 1 天的毫秒,即明天
now.setTime(time); // setTime() 可以将时间设置为我们规定的时间
System.out.println(now); // Thu Dec 12 16:39:54 CST 2019 }
}

在上面的代码中,我们讲解了一些关于 Date 的一些内容,可以看出 Date 已经不是很实用现在的编程,我们充其量也只是用一下 getTime 这个方法。下面我们来看一下 SimpleDateFormat

SimpleDateFormat 可以根据一个给定的日期格式将 String 和 Date 想换转换,格式如下:

现在我们就根据上面的转换格式输出一下当前时间,代码如下:

 import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date; /**
* java.util.SimpleDateFormat 包
* 根据一个给定的日期格式将 String 与 Date 相互转换
*/
public class Main {
public static void main(String[] args) throws ParseException {
// 当前系统时间
Date now = new Date();
System.out.println(now); // Wed Dec 11 16:50:42 CST 2019 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); /**
* 将 String 转为 Date
* String format(Date date)
* format 方法可以将给定的 date 对象所表示的时间
* 按照 SimpleDateFormat 制定的日期格式转换为字符串
*/
String str = sdf.format(now);
System.out.println(str); // 2019-12-12 11:10:53 /**
* 将 Date 转为 String
* Date parse(String str)
* parse 方法可以将给定的 str 按照 SimpleDateFormat 制定的
* 日期格式解析为一个 Date 对象
*/
Date date = sdf.parse(str);
System.out.println(date); // Thu Dec 12 11:47:09 CST 2019
}
}

在上面的代码中,我们实现了 Date 与 String 之间的互转,需要注意的是在使用 parse 方法时需要先抛出异常,这个我们在之后的内容中会详细讲解异常的处理。

接下来我们再来看一下时间操作中的 Calender,

 import java.util.Calendar;
import java.util.Date; /**
* java.util.Calender 包
* 日历类
* 该类事一个抽象类,封装了对时间的相关操作
* 常用的实现类格力高里历(阳历)
* 使用日历类是为了对时间进行相关的操作
* 比如计算时间
*/
public class Main {
public static void main(String[] args) {
/**
* 使用 Calender 的静态方法创建实例,
* 该方法会根据当前系统所在时区创建一个相应的实现
* 通常是 GregorianCalender
* 默认创建的日历实例表示当前系统时间
* */
Calendar calendar = Calendar.getInstance();
// toString 不能直观反映表示的日期
System.out.println(calendar); // java.util.GregorianCalendar[time=1576134924891,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=2019,MONTH=11,WEEK_OF_YEAR=50,WEEK_OF_MONTH=2,DAY_OF_MONTH=12,DAY_OF_YEAR=346,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=2,AM_PM=1,HOUR=3,HOUR_OF_DAY=15,MINUTE=15,SECOND=24,MILLISECOND=891,ZONE_OFFSET=28800000,DST_OFFSET=0] /**
* Calender 与 Date 之间的互转
* Calender -> Date
* Date getTime()
* Calender 提供了方法 getTime()
* 该方法返回一个 Date 对象,该对象表示的时间就是
* 当前 Calender 表示的时间
*/
Date date = calendar.getTime();
System.out.println(date); // Thu Dec 12 15:18:56 CST 2019 /**
* Date -> Calender
* Void setTime(Date date)
* Calender 的 setTime 方法可以使当前
* Calender 表示给定的 Date 所表示的时间
*/
calendar.setTime(date);
}
}

当然 Calender 提供了针对不同时间分量单独设置的值,如下:

 import java.util.Calendar;

 /**
* Calender 提供了针对不同时间分量单独设置值的方法
* void set(int filed, int value)
* 其中第一个参数为:时间分量,例如:年,月,日等等
* 第二个参数为对应的值
* 时间分量是一个 int 值,使用 Calender 提供的常量
*/
public class Main {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
System.out.println(calendar.getTime()); // Thu Dec 12 16:33:06 CST 2019 // 设置 Calender,使其表示 2008-08-08 20:08:08
// 设定年
calendar.set(Calendar.YEAR, 2008);
System.out.println(calendar.getTime()); // Fri Dec 12 16:33:06 CST 2008 // 设置月
calendar.set(Calendar.MONTH, 7); // 月是从 0 开始的
calendar.set(Calendar.MONTH, Calendar.AUGUST); // 也可以使用常量表示月
System.out.println(calendar.getTime()); // Tue Aug 12 16:50:43 CST 2008 /**
* 设置日
* 对应的时间分量常用的
* DATE:月中天
* DAY_OF_MONTH:月中的天,与DATE一致
* DAY_OF_WEEK:周中的天,星期几
* DAY_OF_YEAR:年中的天
* */
calendar.set(Calendar.DATE, 8);
System.out.println(calendar.getTime()); // Fri Aug 08 17:01:48 CST 2008 // 设置小时
calendar.set(Calendar.HOUR, 8);
System.out.println(calendar.getTime()); // Fri Aug 08 08:35:45 CST 2008 // 设置分
calendar.set(Calendar.MINUTE, 8);
System.out.println(calendar.getTime()); // Fri Aug 08 08:08:45 CST 2008 // 设置秒
calendar.set(Calendar.SECOND, 8);
System.out.println(calendar.getTime()); // Fri Aug 08 08:08:08 CST 2008
}
}

在上面的代码中,我们可以根据 set 方法来设定任意我们想要的时间分量。

当然,我们既可以单独设置时间分量,也可以单独获取时间分量,如下:

 import java.util.Calendar;

 /**
* 获取一个 Calender 表示的日期中
* 各个时间分量对应的值
* int get(int filed)
* 获取对应时间分量的值
*/
public class Main {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance(); // 获取年
int year = calendar.get(Calendar.YEAR);
System.out.println(year); // 2019 // 获取月
int month = calendar.get(Calendar.MONTH) + 1; // 月是从 0 开始
System.out.println(month); // 12 // 获取周
int week = calendar.get(Calendar.DAY_OF_WEEK) - 1; // 周是从周日开始的
System.out.println(week == 0 ? 7 : week); //
String[] data = {"日","一","二","三","四","五","六"};
System.out.println(data[week]); // 五 // 获取日
int date = calendar.get(Calendar.DATE);
System.out.println(date); //
}
}

接下来我们再来看一下 Calender 中的时间计算:

 import java.util.Calendar;

 /**
* Calender 中计算时间的方法
* void add(int field, int value)
* 对指定的时间分量加上给定的值,若给定的值是负数
* 则是减去给定的值
*/
public class Main {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
// 查看3年2月1天后的日期 // 查看 3 年后
calendar.add(Calendar.YEAR, 3);
System.out.println(calendar.getTime()); // Tue Dec 13 10:59:29 CST 2022 // 查看 2 月后
calendar.add(Calendar.MONTH, 2);
System.out.println(calendar.getTime()); // Mon Feb 13 10:59:29 CST 2023 // 查看 1 天后
calendar.add(Calendar.DAY_OF_YEAR, 1);
System.out.println(calendar.getTime()); // Tue Feb 14 10:59:29 CST 2023
}
}

Java 从入门到进阶之路(二十)的更多相关文章

  1. Java 从入门到进阶之路(十二)

    在之前的文章我们介绍了一下 Java 类的重写及与重载的区别,本章我们来看一下 Java 类的 private,static,final. 我们在之前引入 Java 类概念的时候是通过商场收银台来引入 ...

  2. Java 从入门到进阶之路(十八)

    在之前的文章我们介绍了一下 Java 中的正则表达式,本章我们来看一下 Java 中的 Object. 在日常生活中,任何事物我们都可以看做是一个对象,在编程中是同样的道理,在 Java 编程中其实更 ...

  3. Java 从入门到进阶之路(十)

    之前的文章我们介绍了一下 Java 中的引用型数组类型,接下来我们再来看一下 Java 中的继承. 继承的概念 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继 ...

  4. Java 从入门到进阶之路(十五)

    在之前的文章我们介绍了一下 Java 中的接口,本章我们来看一下 Java 中类的多态. 在日常生活中,很多意思并不是我们想要的意思,如下: 1.领导:“你这是什么意思?” 小明:“没什么意思,意思意 ...

  5. Java 从入门到进阶之路(十四)

    在之前的文章我们介绍了一下 Java 中的抽象类和抽象方法,本章我们来看一下 Java 中的接口. 在日常生活中,我们会接触到很多类似接口的问题,比如 USB 接口,我们在电脑上插鼠标,键盘,U盘的时 ...

  6. Java 从入门到进阶之路(十六)

    在之前的文章我们介绍了一下 Java 中类的多态,本章我们来看一下 Java 中类的内部类. 在 Java 中,内部类分为成员内部类和匿名内部类. 我们先来看一下成员内部类: 1.类中套类,外面的叫外 ...

  7. Java 从入门到进阶之路(十九)

    在之前的文章我们介绍了一下 Java 中的Object,本章我们来看一下 Java 中的包装类. 在 Java 中有八个基本类型:byte,short,int,long,float,double,ch ...

  8. Java 从入门到进阶之路(二十三)

    在之前的文章我们介绍了一下 Java 中的  集合框架中的Collection 的迭代器 Iterator,本章我们来看一下 Java 集合框架中的Collection 的泛型. 在讲泛型之前我们先来 ...

  9. Java 从入门到进阶之路(二)

    之前的文章我们介绍了一下用 IDEA 编辑器创建一个 Java 项目并输出 HelloWorld,本章我们来看一下 Java 中的变量和基本数据类型. 在这之前我们先来看一下 Java 中的关键字,这 ...

随机推荐

  1. @codeforces - 1086F@ Forest Fires

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 一个无穷大的方格图,每个方格内都种了棵树. 一开始点燃了 n 棵 ...

  2. TensorFlow 池化层

    在 TensorFlow 中使用池化层 在下面的练习中,你需要设定池化层的大小,strides,以及相应的 padding.你可以参考 tf.nn.max_pool().Padding 与卷积 pad ...

  3. pytorch 动态调整学习率 重点

    深度炼丹如同炖排骨一般,需要先大火全局加热,紧接着中火炖出营养,最后转小火收汁.本文给出炼丹中的 “火候控制器”-- 学习率的几种调节方法,框架基于 pytorch 1. 自定义根据 epoch 改变 ...

  4. python中break和continue的区别

    python中break和continue的区别   break和continue 1.break 意思为结束循环   例: i = 0 while i<10:     i+=1     if ...

  5. supersockets和 AppSession,AppServer 配合工作

    现在, 你已经有了 RequestInfo, ReceiveFilter 和 ReceiveFilterFactory, 但是你还没有正式使用它们. 如果你想让他们在你的程序里面可用, 你需要定义你们 ...

  6. Fragment学习(一) :生命周期

    一. 何为Fragment Fragment是activity的界面中的一部分或一种行为.你可以把多个Fragment们组合到一个Activity中来创建一个多面界面,并且你可以在多个Activity ...

  7. 2016年NOIP普及组复赛题解

    题目涉及算法: 买铅笔:入门题: 回文日期:枚举: 海港:双指针: 魔法阵:数学推理. 买铅笔 题目链接:https://www.luogu.org/problem/P1909 设至少要买 \(num ...

  8. 从规则引擎到复杂事件处理(CEP)

    Drools Fusion既是规则引擎,又可以作为CEP.除了事件定义和时间推理之外,对于引擎本身也会有一些不同的使用.主要体现在会话时钟.流模式.滑动窗口和对事件的内存管理. 会话时钟 由于事件的时 ...

  9. Beta版是什么意思

    外部测试版的意思. 软件会出现三种版本 1.alpha内部测试版本,极不稳定,一般也不会出现的公众视线,仅供内部测试人员测试用. 2.beta公共测试版,就是对外发布软件的测试版,收集公众的意见和建议 ...

  10. python3在pycharm中为什么导入random模块不能用? TypeError: 'module' object is not callable

    新手学python求大神指导,也用sys导入了random.py的路径,仍然不行. 刚刚排错貌似找到了问题的原因...那是因为我在pycharm中新建的python文件名就是random,所以当前目录 ...