在之前的文章我们介绍了一下 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); // 1576053403721
- /**
- * 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); // 5
- String[] data = {"日","一","二","三","四","五","六"};
- System.out.println(data[week]); // 五
- // 获取日
- int date = calendar.get(Calendar.DATE);
- System.out.println(date); // 13
- }
- }
接下来我们再来看一下 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
- }
- }
来源: https://www.cnblogs.com/weijiutao/p/12022020.html