在之前的文章我们介绍了一下 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. SDUT-2119_数据结构实验之链表四:有序链表的归并

    数据结构实验之链表四:有序链表的归并 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 分别输入两个有序的整数序列(分别包 ...

  2. 微服务开源生态报告 No.1

    从关注开源,到使用开源,再到参与开源贡献,越来越多的国内开发者通过开源技术来构建业务. 截止目前,Arthas / Dubbo / ChaosBalde / Nacos / RocketMQ / Se ...

  3. iOS开发那些事-响应内存警告

    好的应用应该在系统内存警告情况下释放一些可以重新创建的资源.在iOS中我们可以在应用程序委托对象.视图控制器以及其它类中获得系统内存警告消息. 1.应用程序委托对象 在应用程序委托对象中接收内存警告消 ...

  4. Android 字体库的使用

    开发Android的人大多都知道,Android里面对字体的支持少得可怜,默认情况下,TextView  的 typeface 属性支持 "Sans","serif&qu ...

  5. js常见运算符

    博客地址 :https://www.cnblogs.com/sandraryan/

  6. 使用openssl 工具进行双向认证测试

    1,双向认证测试(需要根证书,客户证书,服务器证书以及各自的私钥)(验证通信双方的身份) openssl s_server -accept -key certs/server.key -cert ce ...

  7. torch.optim优化算法理解之optim.Adam()

    torch.optim是一个实现了多种优化算法的包,大多数通用的方法都已支持,提供了丰富的接口调用,未来更多精炼的优化算法也将整合进来. 为了使用torch.optim,需先构造一个优化器对象Opti ...

  8. mac上的mysql管理工具sequel pro

    https://blog.csdn.net/wan_zaiyunduan/article/details/54909389 以前用过Plsql.Navicat.Workbench,现在换到mac上,用 ...

  9. 【转载】Windows平台下利用APM来做负载均衡方案 - 负载均衡(下)

    概述 我们在上一篇Windows平台分布式架构实践 - 负载均衡中讨论了Windows平台下通过NLB(Network Load Balancer) 来实现网站的负载均衡,并且通过压力测试演示了它的效 ...

  10. BERT的通俗理解 预训练模型 微调

    1.预训练模型      BERT是一个预训练的模型,那么什么是预训练呢?举例子进行简单的介绍      假设已有A训练集,先用A对网络进行预训练,在A任务上学会网络参数,然后保存以备后用,当来一个新 ...