java各个时间类总结归纳,超全一篇_java的几种时间类型

本文主要针对DateCalendarInstantLocalDateLocalTimeLocalDateTime的使用做了介绍并进行了对比,同时对simpleDateFormatsimpleDateFormat进行了对比和介绍。篇幅较长可针对具体模块选择性阅读。

Date

对于Date类型最常用的操作想必就是new Date()了

 public static void main(String[] args) {
  System.out.println(new Date());
}

这时候我们会得到一个当前时间的一个Date类型的字段输出字样为Tue Jun 09 19:20:37 CST 2020 一个带有年月日时分秒的时间。

其中的CST可视为美国、澳大利亚、古巴或中国的标准时间,在这边就是中国的标准时间了。

当然我们对于这样格式的时间的做法是通过java.text.SimpleDateFormat类来进行格式化之后返回页面展示

private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public static void main(String[] args) {
  System.out.println(simpleDateFormat.format(new Date()));
}


输出为2020-06-09 19:43:21这个就是我们最为熟悉的一个时间字段格式化之后的结果了。

当然这里要友情提醒的是SimpleDateFormat这个类并不是线程安全的,在高并发场景下需要谨慎使用。Date类型自带有很多的函数具体如下:

图片

可以发现很多都已经变成过时函数,虽然还可以使用但是并不保证在将来某个更新中被删除的可能性,我们也是不推荐使用这种过时的函数的。

这时候java.util.Calendar是一个不错的类可以帮我们解决很多问题。

相信一开始接触java的小伙伴一定被Calendar的强大征服过,但是用久了慢慢地我们会发现其实这个类并没有想象中那么强大,首先一个问题就是它并不支持时区,其次它也不是线程安全的。

所以考虑到它的种种缺陷,java8使用了新的时间和日期API LocalDateTime

Instant

Instant表示的是时间线上的一个点,也就是时刻,可以和Date做一个比较。

比较直接的一个不同就是Instant获取的是UTC的时间,而Date是根据当前服务器所处的环境的默认时区来获取的当前时间。

//Date案例
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date();
System.out.println("new Date() = "+date);
String s = simpleDateFormat.format(date);
System.out.println("SimpleDateFormat 格式化Date后 = "+s);

//Instant案例
Instant instant = Instant.now();
System.out.println("Instant = "+instant);
System.out.println("Instant +08:00 = "+instant.atOffset(ZoneOffset.ofHours(8)));

输出

new Date() = Wed Jun 10 15:27:48 CST 2020
SimpleDateFormat 格式化Date后 = 2020-06-10 15:27:48
Instant = 2020-06-10T07:27:48.198Z
Instant +08:00 = 2020-06-10T15:27:48.198+08:00

默认时区是UTC在使用Instant的时候是一个需要注意的点,也是容易忽略的一个点,这里划重点!相同的问题在LocalDate、LocalTime和LocalDateTime是不存在的。

但是Instant的官方描述来看,它是一个不可变的且线程安全的类

 * @implSpec
 * This class is immutable and thread-safe.
 * @since 1.8
 */
public final class Instant implements Temporal, TemporalAdjuster, Comparable<Instant>, Serializable {}

有效时间范围是从-1000000000-01-01T00:00Z-1000000000-01-01T00:00Z,可以满足大部分场景下的时刻现实问题。

同时在java8提供了toInsatant()和from()两个方法用于Date和Instant之间的来回转换

System.out.println("toInstant() = "+date.toInstant());
System.out.println("from() = "+Date.from(instant));

输出

toInstant() = 2020-06-10T07:45:42.440Z
from() = Wed Jun 10 15:45:42 CST 2020

可以看到相互转换过程中的时区问题不需要我们考虑,会自动+08:00或者-08:00

比较头疼的一个事情就是java8没有针对Instant提供一个可供自定义的格式化类,所以这边我的解决方法是转换成LocalDateTime,再使用DateTimeFormatter来完成格式化。

System.out.println("Instant = " + LocalDateTime.ofInstant(instant, ZoneId.systemDefault())
        .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));

输出

Instant = 2020-06-10 16:02:26

这样就比较容易的解决了格式化的问题,当然你也可以自定义一个@config来完成对Instant的格式化,也不失为一种一劳永逸的方案。LocalDateTime和DateTimeFormatter在后面的内容中会做详细的介绍。

在讲解LocalDateTime之前我们先分别介绍一下LocalDateLocalTime,以便于能更深入地理解LocalDateTime

LocalDate和LocalTime

LocalDate

LocalDate首先是一个不可变类,默认格式为yyyy-MM-dd,其次它是一个只获取年月日的类,侧重点在日历而不是时间(这里我们需要把日历和时间这两个概念区分开)。

使用LocalDate.now()可以获取当前年月日,也可以使用LocalDate.of(year,month,dayOfMonth)来指定日期

public static void main(String[] args) {
  LocalDate today = LocalDate.now();
  System.out.println("LocalDate.now() = "+today);
  today = LocalDate.of(2020,06,10);
  LocalDate laterDate = today.plusDays(30);
  System.out.println("LocalDate.of() = "+today.toString());
  System.out.println("plusDays = "+laterDate.toString());
  System.out.println("new Date() = "+ new Date());
}

输出

LocalDate.now() = 2020-06-09
LocalDate.of() = 2020-06-10
plusDays = 2020-07-10
new Date() = Tue Jun 09 20:31:22 CST 2020

从这个例子可以对比看出LocalDateDate的不同。

同时作为一个访问器方法,LocalDate每次都是生成一个新的对象,而不是改变原有的对象的值。

可以从today.plusDays(30)中轻易地看到。与之类似的就是更改器方法,在java较早的版本中又一个类java.util.GregorianCalendar

public static void main(String[] args) {
  GregorianCalendar someDay = new GregorianCalendar(2020,06,9);
  System.out.println("before someDay = "+someDay.getTime());
  someDay.add(Calendar.DAY_OF_MONTH,30);
  System.out.println("after someDay = "+someDay.getTime());
}

输出

before someDay = Thu Jul 09 00:00:00 CST 2020
after someDay = Sat Aug 08 00:00:00 CST 2020

可以看到someDay的值随着函数add的调用一直在变化着,这与LocalDate大不一样,这是需要注意的一个点。

这边还需要注意一个点是localDate.getDayOfWeek().getValue(),LocalDate对于一周的枚举计数和Calendar有些不一样。

LocalDate一周是从周一开始计数对应的value值为1,周日结束对应的value值为7。

而Calendar一周是从周日开始计数对应的value值为1,周六结束对应的value为7,相比较下个人觉得LocalDate更加合理和好用一些。

LocalDate常用的方法如下:

图片来自java核心技术卷2

LocalTime

LocalTimeLocalDate类似同样是一个不可变类,默认格式是HH:mm:ss.zzz,可以看到它所关注的是当前的时刻。

public static void main(String[] args) {
  LocalTime localTime = LocalTime.now();
  System.out.println("LocalTime.now() = "+localTime);
  localTime = LocalTime.of(8,8,8,888);
  System.out.println("LocalTime.of() = "+localTime);
  LocalTime laterTime = localTime.plusHours(2);
  System.out.println("localTime.plusHours() = "+laterTime);
  //根据时区获取当前时刻,同理适用与LocalDate
  LocalTime newlocalTime = LocalTime.now(ZoneId.of("America/New_York"));
  System.out.println("America/New_York Time = "+newlocalTime);
}

输出

LocalTime.now() = 20:58:54.941
LocalTime.of() = 08:08:08.000000888
localTime.plusHours() = 10:08:08.000000888
America/New_York Time = 08:58:54.944



### 如何自学黑客&网络安全


#### 黑客零基础入门学习路线&规划


**初级黑客**  
 **1、网络安全理论知识(2天)**  
 ①了解行业相关背景,前景,确定发展方向。  
 ②学习网络安全相关法律法规。  
 ③网络安全运营的概念。  
 ④等保简介、等保规定、流程和规范。(非常重要)


**2、渗透测试基础(一周)**  
 ①渗透测试的流程、分类、标准  
 ②信息收集技术:主动/被动信息搜集、Nmap工具、Google Hacking  
 ③漏洞扫描、漏洞利用、原理,利用方法、工具(MSF)、绕过IDS和反病毒侦察  
 ④主机攻防演练:MS17-010、MS08-067、MS10-046、MS12-20等


**3、操作系统基础(一周)**  
 ①Windows系统常见功能和命令  
 ②Kali Linux系统常见功能和命令  
 ③操作系统安全(系统入侵排查/系统加固基础)


**4、计算机网络基础(一周)**  
 ①计算机网络基础、协议和架构  
 ②网络通信原理、OSI模型、数据转发流程  
 ③常见协议解析(HTTP、TCP/IP、ARP等)  
 ④网络攻击技术与网络安全防御技术  
 ⑤Web漏洞原理与防御:主动/被动攻击、DDOS攻击、CVE漏洞复现


**5、数据库基础操作(2天)**  
 ①数据库基础  
 ②SQL语言基础  
 ③数据库安全加固


**6、Web渗透(1周)**  
 ①HTML、CSS和JavaScript简介  
 ②OWASP Top10  
 ③Web漏洞扫描工具  
 ④Web渗透工具:Nmap、BurpSuite、SQLMap、其他(菜刀、漏扫等)  
 恭喜你,如果学到这里,你基本可以从事一份网络安全相关的工作,比如渗透测试、Web 渗透、安全服务、安全分析等岗位;如果等保模块学的好,还可以从事等保工程师。薪资区间6k-15k


到此为止,大概1个月的时间。你已经成为了一名“脚本小子”。那么你还想往下探索吗?


如果你想要入坑黑客&网络安全,笔者给大家准备了一份:282G全网最全的网络安全资料包评论区留言即可领取!


**7、脚本编程(初级/中级/高级)**  
 在网络安全领域。是否具备编程能力是“脚本小子”和真正黑客的本质区别。在实际的渗透测试过程中,面对复杂多变的网络环境,当常用工具不能满足实际需求的时候,往往需要对现有工具进行扩展,或者编写符合我们要求的工具、自动化脚本,这个时候就需要具备一定的编程能力。在分秒必争的CTF竞赛中,想要高效地使用自制的脚本工具来实现各种目的,更是需要拥有编程能力.


如果你零基础入门,笔者建议选择脚本语言Python/PHP/Go/Java中的一种,对常用库进行编程学习;搭建开发环境和选择IDE,PHP环境推荐Wamp和XAMPP, IDE强烈推荐Sublime;·Python编程学习,学习内容包含:语法、正则、文件、 网络、多线程等常用库,推荐《Python核心编程》,不要看完;·用Python编写漏洞的exp,然后写一个简单的网络爬虫;·PHP基本语法学习并书写一个简单的博客系统;熟悉MVC架构,并试着学习一个PHP框架或者Python框架 (可选);·了解Bootstrap的布局或者CSS。

**8、超级黑客**  
 这部分内容对零基础的同学来说还比较遥远,就不展开细说了,附上学习路线。  
 ![img](https://img-blog.csdnimg.cn/img_convert/3fd39c2ba8ec22649979f245f4221608.webp?x-oss-process=image/format,png)


#### 网络安全工程师企业级学习路线


![img](https://img-blog.csdnimg.cn/img_convert/931ac5ac21a22d230645ccf767358997.webp?x-oss-process=image/format,png)  
 如图片过大被平台压缩导致看不清的话,评论区点赞和评论区留言获取吧。我都会回复的


视频配套资料&国内外网安书籍、文档&工具


当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。

![img](https://img-blog.csdnimg.cn/img_convert/153b2778a3fe5198265bed9635d63469.webp?x-oss-process=image/format,png)  
 一些笔者自己买的、其他平台白嫖不到的视频教程。  
 ![img](https://img-blog.csdnimg.cn/img_convert/32eb4b22aa740233c5198d3c161b37e8.webp?x-oss-process=image/format,png)



  • 11
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值