Java 从入门到进阶之路(二十)
在之前的文章我们介绍了一下 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 从入门到进阶之路(二十)的更多相关文章
- Java 从入门到进阶之路(十二)
在之前的文章我们介绍了一下 Java 类的重写及与重载的区别,本章我们来看一下 Java 类的 private,static,final. 我们在之前引入 Java 类概念的时候是通过商场收银台来引入 ...
- Java 从入门到进阶之路(十八)
在之前的文章我们介绍了一下 Java 中的正则表达式,本章我们来看一下 Java 中的 Object. 在日常生活中,任何事物我们都可以看做是一个对象,在编程中是同样的道理,在 Java 编程中其实更 ...
- Java 从入门到进阶之路(十)
之前的文章我们介绍了一下 Java 中的引用型数组类型,接下来我们再来看一下 Java 中的继承. 继承的概念 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继 ...
- Java 从入门到进阶之路(十五)
在之前的文章我们介绍了一下 Java 中的接口,本章我们来看一下 Java 中类的多态. 在日常生活中,很多意思并不是我们想要的意思,如下: 1.领导:“你这是什么意思?” 小明:“没什么意思,意思意 ...
- Java 从入门到进阶之路(十四)
在之前的文章我们介绍了一下 Java 中的抽象类和抽象方法,本章我们来看一下 Java 中的接口. 在日常生活中,我们会接触到很多类似接口的问题,比如 USB 接口,我们在电脑上插鼠标,键盘,U盘的时 ...
- Java 从入门到进阶之路(十六)
在之前的文章我们介绍了一下 Java 中类的多态,本章我们来看一下 Java 中类的内部类. 在 Java 中,内部类分为成员内部类和匿名内部类. 我们先来看一下成员内部类: 1.类中套类,外面的叫外 ...
- Java 从入门到进阶之路(十九)
在之前的文章我们介绍了一下 Java 中的Object,本章我们来看一下 Java 中的包装类. 在 Java 中有八个基本类型:byte,short,int,long,float,double,ch ...
- Java 从入门到进阶之路(二十三)
在之前的文章我们介绍了一下 Java 中的 集合框架中的Collection 的迭代器 Iterator,本章我们来看一下 Java 集合框架中的Collection 的泛型. 在讲泛型之前我们先来 ...
- Java 从入门到进阶之路(二)
之前的文章我们介绍了一下用 IDEA 编辑器创建一个 Java 项目并输出 HelloWorld,本章我们来看一下 Java 中的变量和基本数据类型. 在这之前我们先来看一下 Java 中的关键字,这 ...
随机推荐
- @codeforces - 1086F@ Forest Fires
目录 @description@ @solution@ @accepted code@ @details@ @description@ 一个无穷大的方格图,每个方格内都种了棵树. 一开始点燃了 n 棵 ...
- TensorFlow 池化层
在 TensorFlow 中使用池化层 在下面的练习中,你需要设定池化层的大小,strides,以及相应的 padding.你可以参考 tf.nn.max_pool().Padding 与卷积 pad ...
- pytorch 动态调整学习率 重点
深度炼丹如同炖排骨一般,需要先大火全局加热,紧接着中火炖出营养,最后转小火收汁.本文给出炼丹中的 “火候控制器”-- 学习率的几种调节方法,框架基于 pytorch 1. 自定义根据 epoch 改变 ...
- python中break和continue的区别
python中break和continue的区别 break和continue 1.break 意思为结束循环 例: i = 0 while i<10: i+=1 if ...
- supersockets和 AppSession,AppServer 配合工作
现在, 你已经有了 RequestInfo, ReceiveFilter 和 ReceiveFilterFactory, 但是你还没有正式使用它们. 如果你想让他们在你的程序里面可用, 你需要定义你们 ...
- Fragment学习(一) :生命周期
一. 何为Fragment Fragment是activity的界面中的一部分或一种行为.你可以把多个Fragment们组合到一个Activity中来创建一个多面界面,并且你可以在多个Activity ...
- 2016年NOIP普及组复赛题解
题目涉及算法: 买铅笔:入门题: 回文日期:枚举: 海港:双指针: 魔法阵:数学推理. 买铅笔 题目链接:https://www.luogu.org/problem/P1909 设至少要买 \(num ...
- 从规则引擎到复杂事件处理(CEP)
Drools Fusion既是规则引擎,又可以作为CEP.除了事件定义和时间推理之外,对于引擎本身也会有一些不同的使用.主要体现在会话时钟.流模式.滑动窗口和对事件的内存管理. 会话时钟 由于事件的时 ...
- Beta版是什么意思
外部测试版的意思. 软件会出现三种版本 1.alpha内部测试版本,极不稳定,一般也不会出现的公众视线,仅供内部测试人员测试用. 2.beta公共测试版,就是对外发布软件的测试版,收集公众的意见和建议 ...
- python3在pycharm中为什么导入random模块不能用? TypeError: 'module' object is not callable
新手学python求大神指导,也用sys导入了random.py的路径,仍然不行. 刚刚排错貌似找到了问题的原因...那是因为我在pycharm中新建的python文件名就是random,所以当前目录 ...