1. 程式人生 > >java工具類-日期工具類

java工具類-日期工具類

1、獲得時間戳 為了統一其他語言的如php和unix系統獲取的時間戳是10位長度的,精確到秒。 java時間戳長度是13位,精確到毫秒 我們獲取時間戳需要相應處理。
//獲取當前時間戳,除以1000,獲取到長度為10位的,精確到秒
      public static long now() {
            return System.currentTimeMillis() / 1000;
      }
2、時間戳轉化為固定模式的日期yyyy-MM-dd HH:mm:ss 兩種時間戳轉換為日期的方法,發現testTime方法比較快。 testTime2將long轉換為字串加0後,再轉為long,需要時間比較久。
      public static String testTime(String pattern, long
timestamp) { SimpleDateFormat format = new SimpleDateFormat(pattern, Locale.SIMPLIFIED_CHINESE); return format.format(timestamp * 1000); } public static String testTime2(String pattern, long timestamp) { SimpleDateFormat format = new SimpleDateFormat(pattern, Locale.SIMPLIFIED_CHINESE);
return format.format(Long.parseLong(String.valueOf(timestamp) + "000")); }
3日期轉換為時間戳 先將日期字串轉為Date物件,再用Date.getTime()獲取時間戳
      public static String datePattern = "yyyy-MM-dd";
      public static String timeStampPattern = "yyyy-MM-dd HH:mm:ss";
      public
static Date toDate(String dateStr) { if (StrKit.isBlank(dateStr)) { return null; } dateStr = dateStr.trim(); int length = dateStr.length(); try { if (length == timeStampPattern.length()) { SimpleDateFormat sdf = new SimpleDateFormat(timeStampPattern); try { return sdf.parse(dateStr); } catch (ParseException e) { dateStr = dateStr.replace(".", "-"); dateStr = dateStr.replace("/", "-"); return sdf.parse(dateStr); } } else if (length == datePattern.length()) { SimpleDateFormat sdfDate = new SimpleDateFormat(datePattern); try { return sdfDate.parse(dateStr); } catch (ParseException e) { dateStr = dateStr.replace(".", "-"); dateStr = dateStr.replace("/", "-"); return sdfDate.parse(dateStr); } } else { throw new IllegalArgumentException("The date format is not supported for the time being"); } } catch (ParseException e) { throw new IllegalArgumentException("The date format is not supported for the time being"); } }

 

測試程式碼如下

            Date obtain = toDate("2017-12-10");
            long ss = obtain.getTime();
            String dateStr = timestamp2DateTime("yyyy-MM-dd HH:mm:ss", ss);
            System.out.println(dateStr);

結果2017-12-10 00:00:00

 

下面是廢話


 

前端用js的Date物件的Date.getTime()方法獲取到的時間戳是13位長度的,精確到毫秒,一般需要進行轉換成精確度到秒。即除以1000 #時間戳轉日期 一般時間戳都是精確到毫秒   預設的時間戳轉日期的方法。 這個方法是呼叫的SimpleDateFormat只有一個引數的構造方法獲得格式轉換物件 這個方法會讓我們對時間格式時區掌控,當系統所在時區發生變化時,日期格式也會發生變化
      public static String timestamp2DateTime(String pattern, long timestamp) {
            SimpleDateFormat format = new SimpleDateFormat(pattern);
            return format.format(timestamp);
      }
上面的SimpleDateFormat(pattern) 預設會指定當前執行環境所在時區為構造方法,這種不確定性的預設應該需要避免
public SimpleDateFormat(String pattern)
    {
        this(pattern, Locale.getDefault(Locale.Category.FORMAT));
    }
我們自己指定需要轉換的時區 獲取到Locale,即指定國家的時間,這裡是獲得簡體中文,北京時間也就是東八區的locale物件 Locale simpleChinese = new Locale("zh","CN"); Locale.SIMPLIFIED_CHINESE
      /**
       * 時間戳轉化為北京時間日期格式
       * @param pattern
       * 如:yyyy-MM-dd HH:mm:ss 獲取時間格式為:  年-月-日 時:分:秒<br>
       *  pattern模式匹配語法:
          G 年代標誌符<br>
          y 年<br>
          M 月<br>
          d 日<br>
          h 時 在上午或下午 (1~12)<br>
          H 時 在一天中 (0~23)<br>
          m 分<br>
          s 秒<br>
          S 毫秒<br>
          E 星期<br>
          D 一年中的第幾天<br>
          F 一月中第幾個星期幾<br>
          w 一年中第幾個星期<br>
          W 一月中第幾個星期<br>
          a 上午 / 下午 標記符<br>
          k 時 在一天中 (1~24)<br>
          K 時 在上午或下午 (0~11)<br>
          z 時區<br>
       * @param timestamp
       * 時間戳
       * @return
       */
      public static String timestamp2DateTime(String pattern, long timestamp) {
            //使用簡體中文所在的時區
            SimpleDateFormat format = new SimpleDateFormat(pattern,Locale.SIMPLIFIED_CHINESE);
            return format.format(timestamp);
      }

 

時間更精確的值 1秒 = 1 X 10E15(次方)飛秒 = 1 X 10E12 皮秒 = 1 X 10E9 納秒 = 1 X 10E6 微妙 = 1 X 10E3 毫秒 1秒 = 1000000000000000飛秒 = 1000000000000皮秒  = 1000000000納秒 = 1000000微秒 = 1000毫秒 1秒 = 1000000000000皮秒  = 1000000000納秒 = 1000000微秒 = 1000毫秒 1秒 = 1000000000納秒 = 1000000微秒 = 1000毫秒 1秒 = 1000000微秒 = 1000毫秒 1秒 =  1000毫秒   #納秒 1秒等於10的9次方納秒 這個納秒只能用來精確統計程式執行的時間,比如計算一個程式執行的時間長短,需要一定的準確度。用currentTimeMillis()只能精確到毫秒 System.currentTimeMillis()起始時間是基於1970.1 10:00:00這個
前段時間專案中需要 統計介面連線時間,考慮到連線時間一般都是零點幾毫秒級別的,為了拿到更精確地數值,沒有使用System.currentTimeMillis(),而是貿然地使用System.nanoTime()來統計時間,後來分析伺服器上的資料,發現 竟然有10-15%的資料數值竟然超過了 10的13次方。

     原因:

System.currentTimeMillis() 起始時間是基於 1970.1.1 0:00:00 這個確定的時間的,而System.nanoTime()是基於cpu核心的時鐘週期來計時,它的開始時間是不確定的。(有篇文章說是根據cpu核心的啟動時間開始計算的)

但是在多核處理器上,由於每個核心的開始時間不確定,但是在多核處理器上,

long start = System.nanoTime();String ip = Utilities.getIpByUrl(url);long cost = System.nanoTime() - start;

這段程式碼有可能會執行在兩個不同的cpu核心上,從而導致得到的結果完全不符邏輯。
這是測試納秒的時間間隔的測試方法 60萬次資料進行測試,600萬資料太大,文字檔案打不開,看來要重新安裝nodepad++才好。
File tmpFile = new File("D:/testNanoTime.txt");
            FileWriter write = null;
            try {
                  write = new FileWriter(tmpFile);
            } catch (IOException e1) {
                  // TODO Auto-generated catch block
                  e1.printStackTrace();
            }
            int size = 600000;
            long[] timeStamp = new long[size];
            for (int i = 0; i < size; i++) {
                  timeStamp[i] = System.nanoTime();
            }
            long increase = 0l;
            for (int i = 0; i < size - 1; i++) {

                  increase = timeStamp[i + 1] - timeStamp[i];
                  if (increase > 0) {
//                      System.out.println("第" + i+1 + "個:"+timeStamp[i + 1]+"第" + i + "個:"+timeStamp[i]+"差值"+increase);
                        try {
                              write.write("第" + i+1 + "個:"+timeStamp[i + 1]+"第" + i + "個:"+timeStamp[i]+"差值"+increase+"\n");
                        } catch (IOException e) {
                              // TODO Auto-generated catch block
                              e.printStackTrace();
                        }
                        
                  }
                  increase = 0;
            }
            try {
                  write.close();
                  
            } catch (IOException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
            }
            System.out.println("操作完成");