Java使用YYYY-MM-dd格式化時間的問題

2021-03-06 新工技術專欄

一、問題表現

二、輸出結果

三、出現問題的原因

四、總結

本文主要介紹Java使用YYYY-MM-dd格式化時間時可能出現的問題,出現問題的原因以及解決問題的方法。

一、問題表現


1@Test 
2public void test() throws Exception { 
3    SimpleDateFormat sj1 = new SimpleDateFormat("YYYY-MM-dd"); 
4    SimpleDateFormat sj2 = new SimpleDateFormat("yyyy-MM-dd"); 
5    Calendar c = Calendar.getInstance(); 
6    /*  2021年12月25日周六  */
7    c.set(2021,12-1,25); 
8    System.out.println("YYYY-MM-dd = " + sj1.format(c.getTime())); 
9    System.out.println("yyyy-MM-dd = " + sj2.format(c.getTime())); 
10    System.out.println("---"); 
11    /*  2021年12月26日 周日  */
12    c.add(Calendar.DATE, 1); 
13    System.out.println("YYYY-MM-dd = " + sj1.format(c.getTime())); 
14    System.out.println("yyyy-MM-dd = " + sj2.format(c.getTime())); 
15  } 
16}

二、輸出結果


1YYYY-MM-dd = 2021-12-25
2yyyy-MM-dd = 2021-12-25
3---
4YYYY-MM-dd = 2022-12-26
5yyyy-MM-dd = 2021-12-26

時間為2021年12月25日時,兩種格式化輸出結果都正確。
當時間為12月26日時,YYYY-MM-dd的年份卻錯誤地變成了2022。


三、出現問題的原因


在日期格式化時,yyyy表示當天所在的年,而大寫的YYYY代表week in which year ,意思是當天所在的周屬於的年份,一周從周日開始,周六結束,只要本周跨年,返回的YYYY就是下一年。

由於yyyy與YYYY的含義不同,當時間為每年的最後一周時,兩種不同格式的日期會出現年份不同的結果。所以在實際開發時建議使用yyyy-MM-dd格式化時間。

相關焦點

  • 聽說又有兄弟因為用YYYY-MM-dd 被錘了...
    還記得去年分享過一篇日期格式化使用 YYYY-MM-dd 的潛在問題(連結如下:http://blog.didispace.com/something-about-YYYY-MM-dd/)的文章不測試邏輯:1、創建兩個日期格式化,一個是出問題的YYYY-MM-dd,另一個是正確用法yyyy-MM-dd2、分別去格式化兩個不同的日期:2020年12月26日(周六),2020年12月27日(周日)具體代碼如下:public class Tests {  @Test   public void test() throws Exception
  • 一個由「 YYYY-MM-dd 」引發的慘案
    鑑於可能會有程式設計師因此而被拉去祭天,而我以前學 Java 的時候就有留意過這個問題,所以我還是把這個問題拿出來說一下,希望能儘量避免這方面的粗心大意(畢竟這種問題也很難測出來)。"); System.out.println("2019-08-31 to yyyy-MM-dd: " + formatUpperCase.format(strDate)); formatUpperCase = new SimpleDateFormat("YYYY-MM-dd"); System.out.println("2019-08
  • java中使用 SimpleDateFormat 格式化日期
    Hi,大家好久不見,今天我們在這裡給大家介紹一下關於Java的小知識,在Java中我們應該如何使用 SimpleDateFormat 格式化日期並顯示,至於運用呢就不和大家做詳細介紹了;接下來就給大家詳細介紹一下如何實現。那我們該如何創建使用呢?
  • 聽說你還在用SimpleDateFormat格式化日期
    );而且項目中的時間和日期API用的也比較混亂,考慮到 java.util.Date 和 java.util.Calendar 不支持時區,且非線程安全,對於日期的計算相對繁瑣,技術部一致要求用JDK1.8以後的 java.time LocalDateTime。
  • 日期格式怎麼設置為yyyy-mm-dd?
    一般情況下,我們錄入日期的格式yyyy/m/dd格式,那如何將其轉換為yyyy-mm-dd呢?今天小編與大家分享2種的解決辦法。第一種方法:利用TEXT函數在單元格中輸入公式=TEXT(B2,"yyyy-mm-dd")即可。很多人會問,那如何將yyyy/m/dd格式更改為yyyymmdd格式?
  • java中date日期計算使用方法
    在java中,日期時間類是我們經常使用的一個類。那麼怎麼創建時間類呢。接下來我們需要使用到一個格式化類,先對他進行初始化:SimpleDateFormat temp=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");使用simpleDateFormat類進行對時間操作。
  • xk-time 1.1.0 發布,Java 時間工具包,增加模糊解析日期功能
    2020年05月23日 17:06:30     * yyyy年MM月dd日 HH時mm分ss秒    2020年05月23日 17時06分30秒     * yyyy-MM-dd HH:mm        2020-05-23 17:06     * yyyy/MM/dd HH:mm        2020/05/23 17:06     *      *
  • excel如何設置日期格式為:yyyy-mm-dd
    日期的格式有很多種,這裡介紹如何將日期格式設置為:yy-mm-dd。:win10 教育版1、打開Excel,輸入一個非yy-mm-dd格式的日期。2、選中單元格並按滑鼠右鍵,選擇「設置單元格格式」3、當我們看到日期的格式中並沒有我們想要的格式的時候,可以去自定義中設置:yy-mm-dd.
  • 2020 年,你還在使用 Java 中的 SimpleDateFormat 嗎?
    這個時候我們就會使用到SimpleDateFormat 類,比如使用下面的代碼來獲取當前時間,並調用SimpleDateFormat 對時間進行格式化:Date date = newDate(); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//設置日期格式
  • 程序猿不要在寫日期轉換工具了,萬能代碼片段直接拿走使用
    )利用枚舉保證單例//①返回當前日期格式化的文本,日期表達式: DATE_TIME_PATTERN = 'yyyy-MM-dd HH:mm:ss'System.out.println(DatePatternEnum.DATE_TIME_PATTERN.format());
  • Java 時間工具包 xk-time 3.0.1 發布,中國工作日計算問題修復
    (1)Java8以前的Date API設計不太好,使用不方便,往往會有線程安全問題。xk-time工具包,使用java8 api,其中Instant、LocalDate、LocalDateTime、LocalTime、ZonedDateTime等都是線程安全的類,而且增加了更豐富的方法,在此基礎上開發相關工具類,線程安全,讓使用更方便。
  • 不一樣的 SQL Server 日期格式化
    Intro最近統計一些數據,需要按天/按小時/按分鐘來統計,涉及到一些日期的格式化,網上看了一些文章大部分都是使用 CONVERT 來轉換的,SQL Server 從 2012 開始增加了 FORMAT 方法,可以使用 FORMAT 來格式化日期,更標準化,更具可定製性,而且和 C# 裡的日期格式化差不多,可以直接把 C# 裡日期的格式直接拿過來用FORMAT 介紹FORMAT
  • xk-time 2.2.0 發布,Java 時間工具包,支持解析自然語言時間,明天...
    (1)Java8以前的Date API設計不太好,使用不方便,往往會有線程安全問題。xk-time工具包,使用java8 api,其中Instant、LocalDate、LocalDateTime、LocalTime、ZonedDateTime等都是線程安全的類,而且增加了更豐富的方法,在此基礎上開發相關工具類,線程安全,讓使用更方便。
  • xk-time 1.1.1 發布,Java 時間工具包 - OSCHINA - 中文開源技術...
    時間轉換,計算,格式化,解析,日曆和cron表達式等的工具,使用java8,線程安全,簡單易用,多達60幾種常用日期格式化模板。0.為什麼要開發這個工具?(1)java8以前的Date API設計不太好,使用不方便,往往會有線程安全問題。
  • SimpleDateFormat 如何安全的使用?
    在 日期和時間模式字符串 中,未加引號的字母 'A' 到 'Z' 和 'a' 到 'z' 被解釋為模式字母,用來表示日期或時間字符串元素。文本可以使用單引號 (') 引起來,以免進行解釋。所有其他字符均不解釋,只是在格式化時將它們簡單複製到輸出字符串。
  • Java——日期格式那些事(一)
    Java開發中,對於時間戳格式化是經常碰到的事,以前總是習慣性地使用『yyyy-MM-dd HH:mm:ss』來對它進行格式化,直到某一天在刷某條的時候,看到了一篇關於『YYYY-MM-dd』和『yyyy-MM-dd』的區別,才開始刻意的在時間格式化時留意不同的格式的區別。
  • C#日期格式化的幾種處理方法 - 51CTO.COM
    DATAFIELD=    "JoinTime    "    DATAFORMATSTRING=    "{0:yyyy-MM-dd[0].Text).ToShortDateString();   C#日期格式化3、用String類轉換日期顯示格式: String.Format(    "yyyy-MM-dd    ",yourDateTime);
  • 不簡單的 Java SimpleDateFormat
    格式化和解析日期是個(痛苦的)日常任務。每天,它都讓我們很頭疼。在 Java 中格式化和解析日期的一種常見方法是使用 SimpleDateFormat。下面是我們用到的一個公共類。正如文檔所述,我們為每個線程持有一個獨立的變量來解決該問題。如果我們想共享對象?有什麼解決方案?1. 方案一:ThreadLocal這個問題可以通過使用 ThreadLocal 變量來解決。ThreadLocal 的 get() 方法將為我們提供當前線程的正確值。
  • 談談Java中的時間類
    如果想獲得現在時刻的「時刻數值」,可以使用:long now = System.currentTimeMillis();這個「時刻數值」是所有時間類的核心值,年月日都是根據這個「數值」計算出來的。我們工作學習涉及的時間相關類有如下這些:Date時間類(java.util.Date)在標準Java類庫中包含一個Date類。它的對象表示一個特定的瞬間,精確到毫秒。1.
  • 俠說java8-LocalDateTime等時間使用手冊(全),先mark後看
    String時間和字符串的轉換,相信大家都知道一般使用SimpleDateFormat來實現,但是這個api使用不當可能會有線程安全問題,這裡推薦使用如下的方式來做轉換,保證thread-safe。//使用當前時間測試LocalDateTime now = LocalDateTime.now();System.out.println("Before : " + now);DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");String formatDateTime