How can I convert the result of System.nanoTime to a date in Java?

前端 未结 3 678
天涯浪人
天涯浪人 2021-01-02 07:59

I want to convert the result of System.nanoTime() to a date.

public void tempBan(Player p, Player banner, int timeInSeconds){
    Long timeInNano = (long) (t         


        
3条回答
  •  孤街浪徒
    2021-01-02 08:35

    In the theory, you should not use the only System.nanotime(), but you can do a simple trick with this method in order to get nanoseconds of the current time.

    public class TimeProvider{
        private final static long  jvm_diff;
        static {
            jvm_diff = System.currentTimeMillis()*1000_000-System.nanoTime();   
        }
    
        public static long getAccurateNow(){
            return System.nanoTime()+jvm_diff;
    
        }
    }
    

    Even though, you can create your own Clock implementation with this way for using high-level java data time classes.

    public class HighLevelClock extends Clock {
    
        private final ZoneId zoneId;
    
        public HighLevelClock(ZoneId zoneId) {
            this.zoneId = zoneId;
        }
        static long nano_per_second = 1000_000_000L;
    
        @Override
        public ZoneId getZone() {
            return zoneId;
        }
    
        @Override
        public Clock withZone(ZoneId zoneId) {
            return new HighLevelClock(zoneId);
        }
    
        @Override
        public Instant instant() {
            long nanos = TimeProvider.getAccurateNow();
            return Instant.ofEpochSecond(nanos/nano_per_second, nanos%nano_per_second);
        }
    
    }
    

    Now we can use our clock implementation like the following:

    Clock highLevelClock = new HighLevelClock(ZoneId.systemDefault());
    System.out.println(LocalDateTime.now(highLevelClock));  //2020-04-04T19:22:06.756194290
    System.out.println(ZonedDateTime.now(highLevelClock));  //2020-04-04T19:22:06.756202923+04:00[Asia/Baku]
    System.out.println(LocalTime.now(highLevelClock));  //19:22:06.756220764
    

提交回复
热议问题