zoukankan      html  css  js  c++  java
  • 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

     待整理:

    dataUtils:

    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
  • 相关阅读:
    Shiro权限验证
    5种设计模式整理
    多模块的SpringBoot项目
    Go使用数据库
    使用Go mod
    docker基本使用
    Go的IO操作
    实现一个网盘存储……
    Go的网络编程
    学习golang的历程
  • 原文地址:https://www.cnblogs.com/lshan/p/9546328.html
Copyright © 2011-2022 走看看