java8 Instant.now()遇到的问题

在java.util.Date类与LocalDate、LocalDateTime类之间转换中
均可以通过Instant作为中间类完成转换,Instant的使用还是比较方便的,下面介绍Instant的使用。

一、创建Instant实例

Instant now = Instant.now();
System.out.println("now:"+now);

控制台输出:

2020-09-08T07:40:40.984Z

注意:通过这种方式获取的时间戳与北京时间相差8个时区,需要修正为北京时间,通过查看源代码发现Instant.now()使用等是UTC时间Clock.systemUTC().instant()。LocalDate、LocalDateTime 的now()方法使用的是系统默认时区 不存在Instant.now()的时间问题。
###解决方法
增加8个小时

Instant now = Instant.now().plusMillis(TimeUnit.HOURS.toMillis(8));
System.out.println("now:"+now);

控制台输出:

2020-09-08T15:40:40.984Z

二、Instant获取long类型的10位秒数、13位毫秒数

Instant now = Instant.now().plusMillis(TimeUnit.HOURS.toMillis(8));
System.out.println("秒数:"+now.getEpochSecond());
System.out.println("毫秒数:"+now.toEpochMilli());

控制台输出:

秒数:1539170157
毫秒数:1539170157886

LocalDateTime输出毫秒数的方式,比Instant多一步转换

LocalDateTime localDateTime = LocalDateTime.now();
//LocalDateTime转Instant
Instant localDateTime2Instant = localDateTime.atZone(ZoneId.systemDefault()).toInstant();
System.out.println("LocalDateTime 毫秒数:"+localDateTime2Instant.toEpochMilli());

控制台输出:

LocalDateTime 毫秒数:1539141733010

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.Date;

/**
 * @author : yewang
 * create at:  2020/9/8  2:33 下午
 */
public class Main {


    //获取当前日期
    public static void getCurrentDate(){
        LocalDate today = LocalDate.now();
        System.out.println("Todays Local date:" + today);
        Date date = new Date();
        System.out.println(date);
    }
    //获取年月日信息
    public static void getDetailDate(){
        LocalDate today = LocalDate.now();
        int year = today.getYear();
        int month = today.getMonthValue();
        int day = today.getDayOfMonth();
        System.out.println(year);
        System.out.println(month);
        System.out.println(day);
    }

    //处理特定日期
    public static void handleSpecialDate(){
        LocalDate dateOfToday = LocalDate.of(2020, 9, 3);
        System.out.println(dateOfToday);
    }

    //判断两个日期是否相等
    public static void compareDate(){
        LocalDate today = LocalDate.now();
        LocalDate date1 = LocalDate.of(2020 , 9, 8);
        if(date1.equals(today)){
            System.out.printf("today %s and date1 %s is sameday",today,date1);
            System.out.println();
        }
    }

    //检查像生日这种周期性事件
    public static void cycleDate(){
        LocalDate today = LocalDate.now();
        LocalDate dateOfBitrh = LocalDate.of(2018, 9, 8);
        MonthDay birthday = MonthDay.of(dateOfBitrh.getMonth(), dateOfBitrh.getDayOfMonth());
        MonthDay currentMonthDay = MonthDay.from(today);
        if (birthday.equals(currentMonthDay)) {
            System.out.println("Happy Birthday!");
        }else{
            System.out.println("Sorry ,today is not your birthday!");
        }
    }
    //获取当前时间
    public static void getCurrentTime(){
        LocalTime now = LocalTime.now();
        System.out.println("local time :" + now);
    }

    //增加小时
    public static void plusHours(){
        LocalTime now = LocalTime.now();
        LocalTime newTime = now.plusHours(4);
        System.out.println(newTime);
    }
    //计算一星期后的日期
    public static void nextWeek(){
        LocalDate today = LocalDate.now();
        LocalDate nextWeek = today.plusDays(7);
        System.out.println("nextWeek is:" + nextWeek);
    }
    //计算一年前或者一年后的日期
    public static void minusDate(){
        LocalDate today = LocalDate.now();
        LocalDate previousYear = today.minus(1, ChronoUnit.YEARS);
        System.out.println("Date before 1 year:" + previousYear);
        LocalDate nextYear = today.plus(1, ChronoUnit.YEARS);
        System.out.println("Date next 1year:" + nextYear);
    }
    //获取时钟类
    public static void clock(){
        // 根据系统时间返回当前时间并设置为UTC。
        Clock clock = Clock.systemUTC();
        System.out.println("Clock : " + clock);

        // 根据系统时钟区域返回时间
        Clock defaultClock = Clock.systemDefaultZone();
        System.out.println("Clock : " + clock);
    }
    //如何用Java判断日期是早于还是晚于另一个日期
    public static void isBeforeOrIsAfter(){
        LocalDate today = LocalDate.now();

        LocalDate tomorrow = LocalDate.of(2018, 1, 29);
        if(tomorrow.isAfter(today)){
            System.out.println("Tomorrow comes after today");
        }

        //减去一天
        LocalDate yesterday = today.minus(1, ChronoUnit.DAYS);

        if(yesterday.isBefore(today)){
            System.out.println("Yesterday is day before today");
        }
    }

    //获取特定时区下面的时间
    public static void getZoneTime(){
        //设置时区
        ZoneId america = ZoneId.of("America/New_York");

        LocalDateTime localtDateAndTime = LocalDateTime.now();

        ZonedDateTime dateAndTimeInNewYork  = ZonedDateTime.of(localtDateAndTime, america );
        System.out.println("现在的日期和时间在特定的时区 : " + dateAndTimeInNewYork);
    }
    //使用 YearMonth类处理特定的日期
    public static void checkCardExpiry(){
        YearMonth currentYearMonth = YearMonth.now();
        System.out.printf("Days in month year %s: %d%n", currentYearMonth, currentYearMonth.lengthOfMonth());

        YearMonth creditCardExpiry = YearMonth.of(2028, Month.FEBRUARY);
        System.out.printf("Your credit card expires on %s %n", creditCardExpiry);
    }
    //检查闰年
    public static void isLeapYear(){
        LocalDate today = LocalDate.now();
        if(today.isLeapYear()){
            System.out.println("This year is Leap year");
        }else {
            System.out.println("2020 is not a Leap year");
        }
    }
    //计算两个日期之间的天数和月数
    public static void calcDateDays(){
        LocalDate today = LocalDate.now();

        LocalDate java8Release = LocalDate.of(2018, Month.MAY, 14);

        Period periodToNextJavaRelease = Period.between(today, java8Release);

        System.out.println("Months left between today and Java 8 release : "
                + periodToNextJavaRelease.getMonths() );
    }
    public static void getTimestamp(){
        Instant timestamp = Instant.now();
        System.out.println("What is value of this instant " + timestamp);
    }
    // 使用预定义的格式化工具去解析或格式化日期
    public static void formateDate(){
        String dayAfterTommorrow = "20180210";
        LocalDate formatted = LocalDate.parse(dayAfterTommorrow, DateTimeFormatter.BASIC_ISO_DATE);
        System.out.printf("Date generated from String %s is %s %n", dayAfterTommorrow, formatted);
    }
    public static void main(String[] args) {
        getCurrentDate();
        getDetailDate();
        handleSpecialDate();
        compareDate();
        cycleDate();
        getCurrentTime();
        plusHours();
        nextWeek();
        minusDate();
        clock();
        isBeforeOrIsAfter();
        getZoneTime();
        checkCardExpiry();
        isLeapYear();
        calcDateDays();
        getTimestamp();
        formateDate();
    }

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值