convert.todatetime指定日期格式_JDK1.8新增日期時間類型

如果我們可以跟別人說:“我們在1502643933071見面,別晚了!”那么就再簡單不過了。但是我們希望時間與晝夜和四季有關,于是事情就變復雜了。Java1.0中包含了一個Date類,但是它的大多數方法已經在Java 1.1引入Calendar類之后被棄用了。而Calendar并不比Date好多少。它們面臨的問題是:

  • 可變性:象日期和時間這樣的類應該是不可變的。Calendar類中可以使用三種方法更改日歷字段:set()、add() 和 roll()。
  • 偏移性:Date中的年份是從1900開始的,而月份都是從0開始的。
  • 格式化:格式化只對Date有用,Calendar則不行。
  • 此外,它們也不是線程安全的,不能處理閏秒等。

Date的API:

盡管 Date 類打算反映協調世界時 (UTC),但無法做到如此準確,這取決于 Java 虛擬機的主機環境。當前幾乎所有操作系統都假定 1 天 = 24 × 60 × 60 = 86400 秒。但對于 UTC,大約每一兩年出現一次額外的一秒,稱為“閏秒”。閏秒始終作為當天的最后一秒增加,并且始終在 12 月 31 日或 6 月 30 日增加。例如,1995 年的最后一分鐘是 61 秒,因為增加了閏秒。大多數計算機時鐘不是特別的準確,因此不能反映閏秒的差別。

在類 Date 所有可以接受或返回年、月、日期、小時、分鐘和秒值的方法中,將使用下面的表示形式:

l 年份 y 由整數 y – 1900 表示。

l 月份由從 0 至 11 的整數表示;0 是一月、1 是二月等等;因此 11 是十二月。

l 日期(一月中的某天)按通常方式由整數 1 至 31 表示。

l 小時由從 0 至 23 的整數表示。因此,從午夜到 1 a.m. 的時間是 0 點,從中午到 1 p.m. 的時間是 12 點。

l 分鐘按通常方式由 0 至 59 的整數表示。

l 秒由 0 至 61 的整數表示;值 60 和 61 只對閏秒發生,盡管那樣,也只用在實際正確跟蹤閏秒的 Java 實現中。于按當前引入閏秒的方式,兩個閏秒在同一分鐘內發生是極不可能的,但此規范遵循 ISO C 的日期和時間約定。

在所有情形中,針對這些目的賦予方法的參數不需要在指定的范圍內;例如,可以把日期指定為 1 月 32 日,并把它解釋為 2 月 1 日的相同含義。

Date date = new Date(2017-1900,8-1,28);

System.out.println(date);//Mon Aug 28 00:00:00 CST 2017

可以說,對日期和時間的操作一直是Java程序員最痛苦的地方之一。第三次引入的API是成功的,并且java 8中引入的java.time API 已經糾正了過去的缺陷,將來很長一段時間內它都會為我們服務。

Java 8 吸收了 Joda-Time 的精華,以一個新的開始為 Java 創建優秀的 API。

  • time – 包含值對象的基礎包
  • time.chrono – 提供對不同的日歷系統的訪問。
  • time.format – 格式化和解析時間和日期
  • time.temporal – 包括底層框架和擴展特性
  • time.zone – 包含時區支持的類

Java 8 吸收了 Joda-Time 的精華,以一個新的開始為 Java 創建優秀的 API。新的 java.time 中包含了所有關于時鐘(Clock),本地日期(LocalDate)、本地時間(LocalTime)、本地日期時間(LocalDateTime)、時區(ZonedDateTime)和持續時間(Duration)的類。歷史悠久的 Date 類新增了 toInstant() 方法,用于把 Date 轉換成新的表示形式。這些新增的本地化時間日期 API 大大簡化了了日期時間和本地化的管理。

說明:大多數開發者只會用到基礎包和format包,也可能會用到temporal包。因此,盡管有68個新的公開類型,大多數開發者,大概將只會用到其中的三分之一。

java.time

5fbfb01027ebf5c99c076519ae4b1021.png

注:ISO-8601日歷系統是國際標準化組織制定的現代公民的日期和時間的表示法,也就是公歷。

java.time.chrono

328109414d289d7e16b84a24eabfb7ef.png

java.time

1、本地日期(LocalDate)、本地時間(LocalTime)、本地日期時間(LocalDateTime)

LocalDate代表IOS格式(yyyy-MM-dd)的日期,可以存儲 生日、紀念日等日期。

LocalTime表示一個時間,而不是日期

LocalDateTime是用來表示日期和時間的,這是一個最常用的類之一。

描述

now() / now(ZoneId zone)

靜態方法,根據當前時間創建對象/指定時區的對象

of()

靜態方法,根據指定日期/時間創建對象

getDayOfMonth()/getDayOfYear()

獲得月份天數(1-31) /獲得年份天數(1-366)

getDayOfWeek()

獲得星期幾(返回一個 DayOfWeek 枚舉值)

getMonth()

獲得月份, 返回一個 Month 枚舉值

getMonthValue() / getYear()

獲得月份(1-12) /獲得年份

getHours()/getMinute()/getSecond()

獲得當前對象對應的小時、分鐘、秒

withDayOfMonth()/withDayOfYear()/withMonth()/withYear()

將月份天數、年份天數、月份、年份修改為指定的值并返回新的對象

with(TemporalAdjuster t)

將當前日期時間設置為校對器指定的日期時間

plusDays(), plusWeeks(), plusMonths(), plusYears(),plusHours()

向當前對象添加幾天、幾周、幾個月、幾年、幾小時

minusMonths() / minusWeeks()/minusDays()/minusYears()/minusHours()

從當前對象減去幾月、幾周、幾天、幾年、幾小時

plus(TemporalAmount t)/minus(TemporalAmount t)

添加或減少一個 Duration 或 Period

isBefore()/isAfter()

比較兩個 LocalDate

isLeapYear()

判斷是否是閏年(在LocalDate類中聲明)

format(DateTimeFormatter t)

格式化本地日期、時間,返回一個字符串

parse(Charsequence text)

將指定格式的字符串解析為日期、時間

//now()
@Test
public void testLocalDateTime(){
LocalDate date = LocalDate.now();
LocalTime time = LocalTime.now();
LocalDateTime datetime = LocalDateTime.now();
}
//of()或parse
@Test
public void testLocalDate() {
// LocalDate date = LocalDate.now();
// LocalDate date = LocalDate.of(2017, 3, 20);
LocalDate date = LocalDate.parse(“2017-03-12”);
}
public static void main(String[] args) {
LocalDateTime t = LocalDateTime.now();
System.out.println(“這一天是這一年的第幾天:”+t.getDayOfYear());
System.out.println(“年:”+t.getYear());
System.out.println(“月:”+t.getMonth());
System.out.println(“月份值:”+t.getMonthValue());
System.out.println(“日:”+t.getDayOfMonth());
System.out.println(“星期:”+t.getDayOfWeek());
System.out.println(“時:”+t.getHour());
System.out.println(“分:”+t.getMinute());
System.out.println(“秒:”+t.getSecond());
System.out.println(t.getMonthValue());
}
@Test
public void testLocalDate2() {
LocalDate date = LocalDate.now();
//withXxx()方法,不改變原來的date對象,返回一個新的對象,不可變性
// LocalDate date2 = date.withDayOfMonth(1);//獲取這個月的第一天
LocalDate date2 = date.with(TemporalAdjusters.firstDayOfMonth());// 獲取這個月的第一天
System.out.println(date2);
// 獲取這個月的最后一天
LocalDate date3 = date.with(TemporalAdjusters.lastDayOfMonth());
System.out.println(date3);
//45天后的日期
LocalDate date4 = date.plusDays(45);
System.out.println(date4);
//20天前的日期
LocalDate date5 = date.minusDays(20);
System.out.println(date5);
boolean before = date.isBefore(date5);
System.out.println(date+”是否比”+date5+”早” + before);
System.out.println(date+”是否是閏年:”+date.isLeapYear());
}
MonthDay month = MonthDay.of(8, 14);
MonthDay today = MonthDay.from(date);
System.out.println(“今天是否是生日:” + month.equals(today));

2、瞬時:Instant

Instant:時間線上的一個瞬時點。 這可能被用來記錄應用程序中的事件時間戳。

在處理時間和日期的時候,我們通常會想到年,月,日,時,分,秒。然而,這只是時間的一個模型,是面向人類的。第二種通用模型是面向機器的,或者說是連續的。在此模型中,時間線中的一個點表示為一個很大的數,這有利于計算機處理。在UNIX中,這個數從1970年開始,以秒為的單位;同樣的,在Java中,也是從1970年開始,但以毫秒為單位。

java.time包通過值類型Instant提供機器視圖。Instant表示時間線上的一點,而不需要任何上下文信息,例如,時區。概念上講,它只是簡單的表示自1970年1月1日0時0分0秒(UTC)開始的秒數。因為java.time包是基于納秒計算的,所以Instant的精度可以達到納秒級。

b3bb90ad5dc60900fcd6e2a078b4f229.png

be3bd5d0e739b798f420e3bc39a754d5.png

時間戳:指格林威治時間1970年01月01日00時00分00秒(北京時間1970年01月01日08時00分00秒)起至現在的總秒數。

public static void main(String[] args) {
Instant t = Instant.now();
System.out.println(t);
//偏移8個小時
OffsetDateTime atOffset = t.atOffset(ZoneOffset.ofHours(8));
System.out.println(atOffset);
long milli = t.toEpochMilli();
System.out.println(milli);
Instant in2 = Instant.ofEpochSecond(10000000);
System.out.println(in2);
}

3、帶時區的日期、時間的處理

作為一個開發者,如果不用去處理時區和它帶來的復雜性,那是幸運的。java.time包下的LocalDate、LocalTime、LocalDateTime和Instant基本能滿足需求。當你不可避免時區時,ZonedDateTime等類可以滿足我們的需求。

ZonedDateTime:一個在ISO-8601日歷系統時區的日期時間,如 2007-12-03T10:15:30+01:00 Europe/Paris。

  • 其中每個時區都對應著ID,地區ID都為“{區域}/{城市}”的格式,例如:Asia/Shanghai等
  • now():使用系統時間獲取當前的ZonedDateTime
  • now(ZoneId):返回指定時區的ZonedDateTime

ZoneId:該類中包含了所有的時區信息,一個時區的ID,如 Europe/Paris

  • getAvailableZoneIds():靜態方法,可以獲取所有時區信息
  • of(String id):靜態方法,用指定的時區信息獲取ZoneId對象

Clock:使用時區提供對當前即時、日期和時間的訪問的時鐘。

public static void main(String[] args) {
Set<String> availableZoneIds = ZoneId.getAvailableZoneIds();
for (String string : availableZoneIds) {
System.out.println(string);
}
ZonedDateTime t = ZonedDateTime.now();
System.out.println(t);
ZonedDateTime t1 = ZonedDateTime.now(ZoneId.of(“America/New_York”));
System.out.println(t1);
// Clock clock = Clock.systemDefaultZone();
Clock c = Clock.system(ZoneId.of(“America/New_York”));
System.out.println(c.getZone());
System.out.println(c.instant());
}

4、持續時間:Duration

Duration:用于計算兩個“時間”間隔

public static void main(String[] args) {
LocalDateTime t1 = LocalDateTime.now();
LocalDateTime t2 = LocalDateTime.of(2017, 8, 29, 0, 0, 0, 0);
Duration between = Duration.between(t1, t2);
System.out.println(between);
System.out.println(“相差的總天數:”+between.toDays());
System.out.println(“相差的總小時數:”+between.toHours());
System.out.println(“相差的總分鐘數:”+between.toMinutes());
System.out.println(“相差的總秒數:”+between.getSeconds());
System.out.println(“相差的總毫秒數:”+between.toMillis());
System.out.println(“相差的總納秒數:”+between.toNanos());
System.out.println(“不夠一秒的納秒數:”+between.getNano());
}

5、日期間隔:Period

Period:用于計算兩個“日期”間隔

public static void main(String[] args) {
LocalDate t1 = LocalDate.now();
LocalDate t2 = LocalDate.of(2018, 12, 31);
Period between = Period.between(t1, t2);
System.out.println(between);
System.out.println(“相差的年數:”+between.getYears());//1年
System.out.println(“相差的月數:”+between.getMonths());//又7個月
System.out.println(“相差的天數:”+between.getDays());//零25天
System.out.println(“相差的總數:”+between.toTotalMonths());//總共19個月
}

10.8.2 java.time.temporal .TemporalAdjuster : 時間校正器

TemporalAdjuster : 時間校正器。有時我們可能需要獲取例如:將日期調整到“下一個工作日”等操作。

TemporalAdjusters : 該類通過靜態方法(firstDayOfXxx()/lastDayOfXxx()/nextXxx())提供了大量的常用 TemporalAdjuster 的實現。

public static void main(String[] args) {
LocalDate now = LocalDate.now();
System.out.println(“下一個周日:”+now.with(TemporalAdjusters.next(DayOfWeek.SUNDAY)));
System.out.println(“下周五” + now.with(TemporalAdjusters.next(DayOfWeek.FRIDAY)));
System.out.println(“本月最后一天:”+now.with(TemporalAdjusters.lastDayOfMonth()));//2017-08-31
LocalDate week = LocalDate.now().with(new TemporalAdjuster(){
@Override
public Temporal adjustInto(Temporal temporal) {
LocalDate date = (LocalDate) temporal;
if(date.getDayOfWeek().equals(DayOfWeek.MONDAY)){
return date.plusDays(7);
}else if(date.getDayOfWeek().equals(DayOfWeek.TUESDAY)){
return date.plusDays(6);
}else if(date.getDayOfWeek().equals(DayOfWeek.WEDNESDAY)){
return date.plusDays(5);
}else if(date.getDayOfWeek().equals(DayOfWeek.THURSDAY)){
return date.plusDays(4);
}else if(date.getDayOfWeek().equals(DayOfWeek.FRIDAY)){
return date.plusDays(3);
}else if(date.getDayOfWeek().equals(DayOfWeek.SATURDAY)){
return date.plusDays(2);
}else{
return date.plusDays(1);
}
}
});
System.out.println(“下一個工作日:” + week);
}

10.8.3 java.time.format.DateTimeFormatter 類

該類提供了三種格式化方法:

預定義的標準格式。如:ISO_DATE_TIME;ISO_DATE

本地化相關的格式。如:ofLocalizedDate(FormatStyle.MEDIUM)

自定義的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)

public static void main(String[] args) {
System.out.println(DateTimeFormatter.ISO_DATE.format(LocalDate.now()));
System.out.println(DateTimeFormatter.ISO_DATE_TIME.format(LocalDateTime.now()));
//FULL和SHORT適用于LocalDate和LocalTime
System.out.println(DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL).format(LocalDate.now()));
System.out.println(DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT).format(LocalTime.now()));
//LONG和MEDIUM適用于LocalDateTime
System.out.println(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM).format(LocalDateTime.now()));
DateTimeFormatter op = DateTimeFormatter.ofPattern(“yyyy-MM-dd HH:mm:ss”);
System.out.println(op.format(LocalDateTime.now()));
}

10.8.4 與傳統日期處理的轉換

9a205603bdd62a6b862a14ef65e2be0e.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/529137.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/529137.shtml
英文地址,請注明出處:http://en.pswp.cn/news/529137.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux shell運行腳本命令行參數,shell腳本命令行參數簡介

之所以用到命令行參數&#xff0c;關鍵在于shell腳本需要與運行腳本的人員進行交互。bash shell提供了命令行參數添加在命令后面的數據值)、命令行選項修改命令行為的單字符值)和直接讀取鍵盤輸入。1、命令行參數向shell腳本傳遞數據的最基本方式是使用命令行參數。1)讀取參數讀…

eclipse linux遠程調試工具,使用本地Eclipse IDE調試器與遠程項目源(Linux)

我試圖找出以下情況的最佳方法。我有幾個Java源文件正在使用JNI與一些C源代碼進行通信&#xff0c;這些源代碼都駐留在Linux機器上。 Java部分在Linux機器上完美地構建和運行(通過JUnit)。 Java類依賴于幾個Linux(.so)庫。我想在本地計算機(Mac OS X)上運行Eclipse IDE調試器&a…

python下載文件的第三方庫_Python常用第三方庫(轉載)

wxPython 如果你之前是 windows 程序員&#xff0c;用 MFC 或者 WIN32API 開發界面程序&#xff0c;那進入 Python 國度最好的 GUI 選擇應該是 wxPython。它是 wxWidgets 的 Python Bind&#xff0c;與 wxWidgets 的開發完美同步&#xff0c;最為重要的一點是它的消息機制與 MF…

linux sybase 自動備份,Linux平臺下Sybase數據庫備份方法分析.doc

Linux平臺下Sybase數據庫備份方法分析Linux平臺下Sybase數據庫備份方法分析摘 要&#xff1a;對于從事信息系統管理的人員來說&#xff0c;掌握數據庫的備份方法在工作中尤為重要。當本地數據出錯或者磁盤損壞時&#xff0c;可以利用備份的數據恢復數據庫系統&#xff0c;從而保…

facebook對話鏈接_如何應用防錯原則,看看 Facebook 和 Gmail 是怎么做的

歡迎來到有言有料&#xff0c;讓思考更有張力本文共 3873 字&#xff0c;預計閱讀 10 分鐘作者&#xff5c;Siddharth Gulati譯者&#xff5c;張聿彤本文翻譯已獲得作者的正式授權(授權截圖如下)在用戶界面(UI)設計中&#xff0c;重要的是要注意最細微的細節&#xff0c;以使用…

linux 7 定時任務設置,centos7 配置crontab定時任務

1. 啟動cron服務# 查看服務狀態systemctl status crond# 啟動systemctl start crond# 停止systemctl stop crond# 重啟systemctl restart crond# 重新加載systemctl reload crond2. 開機自動啟動cron服務systemctl start crond.service3. 通過crontab命令管理定時任務crontab命…

模擬灰度傳感器循跡的程序_PLC編程,實例講解西門子PLC模擬量編程

給大伙分享的是關于西門子S7-300PLC模擬量方面的實例&#xff0c;包含了以下幾個方面的要點&#xff1a;1、對變送器進行取值&#xff0c;并進行控制2、對模數功能塊 FC105 進行調用3、對 AI 模塊進行設置4、對 AI 量程塊進行選擇這個實例&#xff0c; 調試的是一個流量調節回路…

linux mint 17 輸入法,LinuxMint17.1 Rebecca中安裝設置輸入法

LinuxMint14使用了幾年一直未更新&#xff0c;突然想去更新一下去發現源已經不支持了&#xff0c;所以就直接安裝了最新版本。安裝好以后發現還是跟以前一樣的毛病&#xff0c;沒有中文輸入法&#xff0c;直接sudo aptitude install fcitx* 發現仍然不行。運行im-config設定FCI…

python組成不重復的三位數是多少_Python輸出由1,2,3,4組成的互不相同且無重復的三位數...

題目&#xff1a;有四個數字&#xff1a;1、2、3、4&#xff0c;能組成多少個互不相同且無重復數字的三位數&#xff1f;各是多少&#xff1f; 程序分析&#xff1a;可填在百位、十位、個位的數字都是1、2、3、4。組成所有的排列后再去 掉不滿足條件的排列。 程序源代碼 方法1&…

作業調度C語言編寫,【作業調度方案】 (C語言代碼)

解題思路:如圖所示&#xff0c;對于第一組樣例輸入&#xff0c;按照總工序提供的順序&#xff0c;對于每個工件的工序從小到大&#xff0c;每次尋找有空閑機器的“空檔”插入&#xff0c;就能讓總加工時間最短。注意事項:按照約定&#xff0c;最短方案有且只有一種。參考代碼:#…

python判斷能否組成三角形_python三角形判定怎么做

python三角形判定怎么做&#xff1f;下面給大家帶來具體的例子&#xff1a; 相關推薦&#xff1a;《Python視頻教程》 例子&#xff1a;a int(input("The length of the side a ")) b int(input("The length of the side b ")) c int(input("The…

文件的記錄c語言程序,c語言程序學生籍貫信息記錄簿設計.docx

c 語言程序學生籍貫信息記錄簿設計學生籍貫信息記錄簿課程設計報告書班 級: 方 0909-1 學 號:姓 名: 苑 小 葉 指導教師 : 康 亞 男 石家莊鐵道大學四方學院2010年 07月 14日1課程設計報告內容1. 選擇題目題目: 學生籍貫信息記錄簿設計 2. 內容摘要摘要:學生籍貫信息管理系統是…

如何修改linux的java路徑_修改桌面文件默認存儲位置的正確方式及注意事項

之前寫了篇關于如何修改桌面文件默認存儲位置&#xff0c;許多人在修改后出現各種問題&#xff0c;今天重新來講解一下關于修改桌面文件默認存儲位置的正確方式及注意事項。第一步、在E盤下創建一個文件夾&#xff0c;隨便取個名字&#xff0c;或者默認為【新建文件夾】&#x…

secp256r1 c語言程序,rust代碼閱讀 之 libsecp256k1 (1)

在密碼學的運算中, 數字通常是非常大的. 以 ECDSA 橢圓曲線為例, 私鑰是 256 位的.所以在 libsecp256k1 這個庫里, 定義了計算的元素 Field. 其中 n 為 320 位.pub struct Field {pub(crate) n: [u32; 10],pub(crate) magnitude: u32,pub(crate) normalized: bool,}為其實現加法…

python位運算符_詳細介紹Python語言中的按位運算符

按位運算符是把數字看作二進制來進行計算的。Python中的按位運算法則如下&#xff1a; 按位與 ( bitwise and of x and y ) & 舉例&#xff1a; 5&3 1 解釋&#xff1a; 101 11 相同位僅為個位1 &#xff0c;故結果為 1 按位或 ( bitwise or of x and y ) | 舉例&…

c語言代碼測試電腦性能,【圖片】今天寫幾個性能測試,為什么C語言跑得這么慢呢??【c語言吧】_百度貼吧...

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓易言版本……跑100000萬成績不如PHP。。。。.版本 2.程序集 程序集1.子程序 _啟動子程序, 整數型, , 本子程序在程序啟動后最先執行.局部變量 參數, 文本型, , "0".局部變量 to, 整數型.局部變量 fr, 整數型.局部變量 n,…

python find函數 和index的區別_使用帶有find和index的map時Python2和Python3之間的區別...

給定一個模式和一個字符串str,找到str是否遵循相同的模式. 以下是完全匹配,使得在模式中的字母和str中的非空字之間存在雙射. 例子&#xff1a; pattern “abba”,str “dog cat cat dog”應該返回true;狗是一只貓,貓是b,而這些詞形成了abba模式. pattern “abba”,str “dog c…

c語言3368題目,電大《C語言程序設計課程》期末考試復習資料

0993C 評議程序設計A 第 1 頁 共 31 頁C 語言程序設計課程期末復習練習一、單選題 1&#xff0e;在每個C 語言程序中都必須包含有這樣一個函數&#xff0c;該函數的函數名為( )。A. main 2&#xff0e;每個C 語言程序文件的編譯錯誤分為( )類。B. 2 3. 字符串"ab12\n"…

【LeetCode】鏈表精選12題

目錄 快慢指針&#xff1a; 1. 相交鏈表&#xff08;簡單&#xff09; 2. 環形鏈表&#xff08;簡單&#xff09; 3. 快樂數&#xff08;簡單&#xff09; 4. 環形鏈表 II&#xff08;中等&#xff09; 5. 刪除鏈表的倒數第 N 個節點&#xff08;中等&#xff09; 遞歸迭…

python類的屬性和對象屬性_python 類屬性、對象屬性-阿里云開發者社區

類的普通屬性:  dir(Myclass), 返回一個key列表&#xff1b; Myclass.__dir__,返回一個字典&#xff1b; 1、類的數據屬性&#xff1b; 2、類的方法&#xff1b; 類的特殊屬性&#xff1a; 1、Myclass.__name__  類的名字 2、Myclass.__doc__   類的文檔字符串 3、Mycla…