JDK8時間格式轉換

來源:https://blog.csdn.net/zhangzijiejiayou/article/details/76597329


LocalDateTime 本地日期時間 LocalDateTime 同時表示了時間和日期,至關於前兩節內容合併到一個對象上了。LocalDateTime和LocalTime還有LocalDate同樣,都是不可變的。LocalDateTime提供了一些能訪問具體字段的方法。 代碼以下: LocalDateTime sylvester
= LocalDateTime.of(2014, Month.DECEMBER, 31, 23, 59, 59); DayOfWeek dayOfWeek = sylvester.getDayOfWeek(); System.out.println(dayOfWeek); // WEDNESDAY Month month = sylvester.getMonth(); System.out.println(month); // DECEMBER long minuteOfDay = sylvester.getLong(ChronoField.MINUTE_OF_DAY); System.out.println(minuteOfDay); // 1439 只要附加上時區信息,就能夠將其轉換爲一個時間點Instant對象,Instant時間點對象能夠很容易的轉換爲老式的java.util.Date。代碼以下: Instant instant = sylvester .atZone(ZoneId.systemDefault()) .toInstant(); Date legacyDate = Date.from(instant); System.out.println(legacyDate); // Wed Dec 31 23:59:59 CET 2014 格式化LocalDateTime和格式化時間和日期同樣的,除了使用預約義好的格式外,咱們也能夠本身定義格式: 代碼以下: DateTimeFormatter formatter = DateTimeFormatter .ofPattern("MMM dd, yyyy - HH:mm"); LocalDateTime parsed = LocalDateTime.parse("Nov 03, 2014 - 07:13", formatter); String string = formatter.format(parsed); System.out.println(string); // Nov 03, 2014 - 07:13 和java.text.NumberFormat不同的是新版的DateTimeFormatter是不可變的,因此它是線程安全的。 項目中計算兩個日期之間的天數代碼: LocalDate date1 = LocalDate.parse("2015-12-01"); LocalDate date2 = LocalDate.parse("2016-12-01"); System.out.println(date1.until(date2, ChronoUnit.DAYS)); util包下有各類返回的類型。

 

private static final ConcurrentMap<String, DateTimeFormatter> FORMATTER_CACHE = new ConcurrentHashMap<>();

    private static final int PATTERN_CACHE_SIZE = 500;
    /**
     * Date轉換爲格式化時間
     * @param date date
     * @param pattern 格式
     * @return
     */
    public static String format(Date date, String pattern){
        return format(LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()), pattern);
    }

    /**
     * localDateTime轉換爲格式化時間
     * @param localDateTime localDateTime
     * @param pattern 格式
     * @return
     */
    public static String format(LocalDateTime localDateTime, String pattern){
        DateTimeFormatter formatter = createCacheFormatter(pattern);
        return localDateTime.format(formatter);
    }

    /**
     * 格式化字符串轉爲Date
     * @param time 格式化時間
     * @param pattern 格式
     * @return
     */
    public static Date parseDate(String time, String pattern){
        return Date.from(parseLocalDateTime(time, pattern).atZone(ZoneId.systemDefault()).toInstant());

    }

    /**
     * 格式化字符串轉爲LocalDateTime
     * @param time 格式化時間
     * @param pattern 格式
     * @return
     */
    public static LocalDateTime parseLocalDateTime(String time, String pattern){
        DateTimeFormatter formatter = createCacheFormatter(pattern);
        return LocalDateTime.parse(time, formatter);
    }

    /**
     * 在緩存中建立DateTimeFormatter
     * @param pattern 格式
     * @return
     */
    private static DateTimeFormatter createCacheFormatter(String pattern){
        if (pattern == null || pattern.length() == 0) {
            throw new IllegalArgumentException("Invalid pattern specification");
        }
        DateTimeFormatter formatter = FORMATTER_CACHE.get(pattern);
        if(formatter == null){
            if(FORMATTER_CACHE.size() < PATTERN_CACHE_SIZE){
                formatter = DateTimeFormatter.ofPattern(pattern);
                DateTimeFormatter oldFormatter = FORMATTER_CACHE.putIfAbsent(pattern, formatter);
                if(oldFormatter != null){
                    formatter = oldFormatter;
                }
            }
        }

        return formatter;
    }
View Code
<code class="language-java">/**
 * TestLocalDateTime.java
 * com.javabase.test17
 * 本文轉載自 尚硅谷視頻中教學代碼 http://www.gulixueyuan.com/my/course/56 第十八 十九講
*/


package com.javabase.test17;


import java.time.DayOfWeek;
import java.time.Duration;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.Period;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;
import java.util.Set;


import org.junit.Test;


/**
 * java 8 對於日期和時間的使用
 *
 * @author   Chufanzgheng(1280251739@qq.com)
 * @Date     2018年1月24日      
 */
public class TestLocalDateTime {
    
    
    /**
     * localDate The operation of time
     */
    @Test
    public void  test1(){
        
        LocalDateTime localDateTime = LocalDateTime.now();
        System.out.print("++++【localDateTime】++++"+localDateTime);
        // -------iso 標準時間體系-------
        LocalDateTime localDateTime1 = LocalDateTime.of(2018, 1, 24, 9, 46);
        System.out.println("++++++【localDateTime1】+++++"+localDateTime1);
        LocalDateTime localDateTime2 = localDateTime1.minusDays(20);
        System.out.println("+++++++【localDateTime2】+++++++"+localDateTime2);
        System.out.println("+++++++【localDateTime2.plusMonths(2)】+++++++++"+localDateTime2.plusMonths(2));
        System.out.println("localDateTime2.getYear()"+localDateTime2.getYear());
        System.out.println("localDateTime2.getMonthValue()"+localDateTime2.getMonthValue());
        System.out.println("localDateTime2.getMonth()"+localDateTime2.getMonth());
        System.out.println("localDateTime2.getDayOfWeek()"+localDateTime2.getDayOfWeek());
        System.out.println("localDateTime2.getDayOfMonth()"+localDateTime2.getDayOfMonth());
        System.out.println("localDateTime2.getHour()"+localDateTime2.getHour());
        System.out.println("localDateTime2.getMinute()"+localDateTime2.getMinute());
        System.out.println("localDateTime2.getSecond()"+localDateTime2.getSecond());
    }
    
    //2. Instant : 時間戳。 (使用 Unix 元年  1970年1月1日 00:00:00 所經歷的毫秒值)
    @Test
    public void test2(){
        
        Instant ins = Instant.now();  //默認使用 UTC 時區
        System.out.println(ins);
        //偏移時區調整
        OffsetDateTime odt = ins.atOffset(ZoneOffset.ofHours(8)); // 時間偏移量8個小時
        System.out.println(odt);
        System.out.println("++++ins.getNano()++++"+ins.getNano()); 
        Instant ins2 = Instant.ofEpochSecond(5); 
        System.out.println("++++ins2++++"+ins2);
    }
    
    /**
     * 計算時間間隔  Duration Period
     * @throws InterruptedException 
     *  toMillis()
     * 
     */
    @Test
    public void test3() throws InterruptedException{
        
        Instant instantBegin = Instant.now();
        Thread.sleep(2000);
        Instant instantEnd = Instant.now();
        System.out.println("輸出當前時間間隔差"+Duration.between(instantBegin, instantEnd).toMillis());
        // -----------------------------------------------------------------------
        LocalDate local1 = LocalDate.now();
        LocalDate local2 = LocalDate.of(2016, 7, 24);
        Period period = Period.between(local1, local2);
        System.out.println("++++year++++"+period.getYears());
        System.out.println("++++month++++"+period.getMonths());
        System.out.println("++++days++++"+period.getDays());
    }
    
    /**
     * 時間校訂器
     * TemporalAdjuster
     */
    @Test
    public void test4(){
        
        LocalDateTime ldt = LocalDateTime.now();
        System.out.println("-----ldt-----"+ldt);
        
        LocalDateTime ldt2 = ldt.withDayOfMonth(30);//表示爲本月中的第幾天
        System.out.println("----ldt2----"+ldt2);
        
        //計算下週一的時間
        LocalDateTime ldt3 = ldt.with(TemporalAdjusters.next(DayOfWeek.MONDAY));
        System.out.println("------ldt3-----"+ldt3);
        
        //自定義:下一個工做日
        LocalDateTime ldt4 = ldt.with((local) ->{
            
            LocalDateTime ldt5 = (LocalDateTime) local;
            DayOfWeek dow = ldt5.getDayOfWeek();
            
            if(dow.equals(DayOfWeek.FRIDAY)){
                return ldt5.plusDays(3);
            }else if(dow.equals(DayOfWeek.SATURDAY)){
                return ldt5.plusDays(2);
            }else{
                return ldt5.plusDays(1);
            }
        });
        System.out.println("-------ldt4-----"+ldt4);
        
    }
    
    
    /**
     * 5. DateTimeFormatter : 解析和格式化日期或時間
     */
    @Test
    public void test5(){
        
        DateTimeFormatter dateTimeFormater = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH時mm分ss秒");
        LocalDateTime localDateTime = LocalDateTime.now();
        System.out.println("【----未格式化以前----】" + localDateTime);
        System.out.println("【----格式化以後----】"+dateTimeFormater.format(localDateTime));
    }
    
    @Test
    public void test6(){
        
        Set<String> set = ZoneId.getAvailableZoneIds();
        set.forEach(System.out::println);
    }
    
    /**
     * 7.ZonedDate、ZonedTime、ZonedDateTime : 帶時區的時間或日期
     */
    @Test
    public void test7(){
        
        LocalDateTime ldt = LocalDateTime.now(ZoneId.of("Asia/Shanghai"));
        System.out.println("----【ldt】----"+ldt);
        
        ZonedDateTime zdt =  ZonedDateTime.now(ZoneId.of("America/New_York"));
        System.out.println("----【zdt】----"+zdt);
    }
    
    
    /**
     * <B>備註:<B>
     * 
     * zone    英[zəʊn]美[zoʊn]n.地帶; 區域,範圍; 地區,時區;  [物] 晶帶;vt.    劃分紅帶; 用帶子圍繞;vi.    分紅區,分紅地帶;
     * 
     * available 英[əˈveɪləbl]美[əˈveləbəl]adj.    可得到的; 有空的; 可購得的; 能找到的;
     * 
     * offset 美[ˈɔ:fset]vt.  抵消; 補償; (爲了比較的目的而)把…並列(或並置) ; 
     * 爲(管道等)裝支管;vi.    造成分支,長出分枝; 裝支管;n.    開端; 出發; 平版印刷; 抵消,補償;
     * 
     * duration    美[duˈreɪʃn] n.    持續,持續的時間,期間; (時間的) 持續,持久,連續; [語音學] 音長,音延;
     * 
     * instant    英[ˈɪnstənt] 美[ˈɪnstənt] n.    瞬間,頃刻; 此刻; 當月; 速食食品,即溶飲料; adj.    當即的; 迫切的; 正在考慮的,目前的; 即食的;
     * 
     * temporal 英[ˈtempərəl] 美[ˈtɛmpərəl,ˈtɛmprəl] adj.時間的; 世俗的; 暫存的; <語>表示時間的; n.暫存的事物,世間的事物; 世俗的權力; 一時的事物,俗事;
     * 
     * adjuster    英[ə'dʒʌstə] 美[ə'dʒʌstə] n.調停者,調節器;
     * 
     */
    
    


}

</code>
View Code

 待整理:java

dataUtils:spring

package com.icil.esolution;

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;

import org.junit.Test;
import org.springframework.util.Assert;

public class DateUtils {

      /**
     * 將字符串轉日期成Long類型的時間戳,格式爲:yyyy-MM-dd HH:mm:ss
     */
    public static Long convertTimeToLong(String timestr) { 
        Assert.notNull(timestr, "time is null");
        DateTimeFormatter ftf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime parse = LocalDateTime.parse(timestr, ftf);
        return LocalDateTime.from(parse).atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
    }  
    
   
    
    
    /**
      * 將Long類型的時間戳轉換成String 類型的時間格式,時間格式爲:yyyy-MM-dd HH:mm:ss
     */
    public static String convertTimeToString(Long time){
        Assert.notNull(time, "time is null");
        DateTimeFormatter ftf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        return ftf.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(time),ZoneId.systemDefault()));
    }
    
    @Test
    public void testName11() throws Exception {
        long time=1417792627L;

         Assert.notNull(time, "time is null");
         DateTimeFormatter ftf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
          String format = ftf.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(time),ZoneId.systemDefault()));
          System.out.println(format);
    }
    
    @Test
    public void testName() throws Exception {
         DateTimeFormatter ftf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        Date date = new Date();
            LocalDateTime parse = LocalDateTime.parse("2018-05-29 13:52:50", ftf);
             long epochMilli = LocalDateTime.from(parse).atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
             System.out.println(epochMilli);
    }
    
    /**
       *     將Date轉換爲LocalDatetime,方式:
     * @param args
     */
    public static LocalDateTime dateToLocalDateTime(Date date) {
//        1.從日期獲取ZonedDateTime並使用其方法toLocalDateTime()獲取LocalDateTime
//        2.使用LocalDateTime的Instant()工廠方法
        Instant instant = date.toInstant();
        ZoneId zoneId = ZoneId.systemDefault();
        LocalDateTime localDateTime = instant.atZone(zoneId).toLocalDateTime();
        return localDateTime;
    }
    
    /**
        *  將LocalDateTime轉換回java.util.Date:
     * 1.使用atZone()方法將LocalDateTime轉換爲ZonedDateTime 
       2.將ZonedDateTime轉換爲Instant,並從中獲取Date
     * @param args
     */
    public static Date localDateTimeToDate(LocalDateTime localDateTime) {
        ZoneId zoneId = ZoneId.systemDefault();
//        LocalDateTime localDateTime = LocalDateTime.now();
        ZonedDateTime zdt = localDateTime.atZone(zoneId);
        Date date = Date.from(zdt.toInstant());
        return date;
    }
    
    
    
    
    @Test
    public void testName2() throws Exception {
          DateTimeFormatter f = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
            //時間轉爲字符串
          LocalDateTime date =LocalDateTime.now();
          System.out.println(date);
            String str = date.format(f);  // 2014-11-07 14:10:36
            System.out.println(str);
            //字符串轉爲時間
            date = LocalDateTime.parse(str,f); 
            System.out.println(date);
    }
    
    
    
}
View Code
相關文章
相關標籤/搜索