1. 程式人生 > >java時間,日期,毫秒值,String的相互轉換總結

java時間,日期,毫秒值,String的相互轉換總結

java時間日期的各種轉換總結以及應用例項

由於工作中經常要用到時間,日期,以及當前時間的毫秒值等

很多時候涉及到了它們之間的相互轉換,今天就好好的總結一下.

首先基本介紹一下java中有關時間,日期的類

1. Date類

裡面的很多方法已經過時被Calendar或者DateFormat類取代

兩種常用的構造方法例項:(其餘的已經過時)


Date date = new Date();
// 這種構造方法傳遞的引數是1970年1月1日到傳遞時間所經歷的毫秒數
Date date2 = new Date(System.currentTimeMillis());
輸出的結果如下:
Sat
Mar 17 10:13:23 CST 2018 Sat Mar 17 10:13:23 CST 2018

2. Calendar類

常用的初始化方法:

Calendar calendar = Calendar.getInstance();
// 返回的結果:
java.util.GregorianCalendar[time=1521253372638,areFieldsSet=true,areAllFieldsSet=true,
lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",
offset=28800000,dstSavings=0
,useDaylight=false,transitions=19,lastRule=null], firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2018,MONTH=2,WEEK_OF_YEAR=11, WEEK_OF_MONTH=3,DAY_OF_MONTH=17,DAY_OF_YEAR=76,DAY_OF_WEEK=7,DAY_OF_WEEK_IN_MONTH=3, AM_PM=0,HOUR=10,HOUR_OF_DAY=10,MINUTE=22,SECOND=52,MILLISECOND=638, ZONE_OFFSET=28800000,DST_OFFSET=0
] // 從結果中可以看到,相比於Date類,Calendar類包含了更多的資訊 // 除了年月日,時分秒等基本資訊還包括當前時間的毫秒值,所在時區等各種資訊

3. DateFormat類

初始化方法:

SimpleDateFormat sdf =new SimpleDateFormat("yyyyMMddHHmmssS");

這裡簡單介紹日期型別常用的format格式:

1.yyyy指的是年(類似於2018), yy指的是年的後兩位(類似於18)
2.大寫的MM指的是月份,小寫的mm指的是分鐘
3.dd指的是天
4.大寫的HH表示的是24小時制,hh表示的是12小時制
5.ss指的是秒,ssS指的是精確到毫秒
6.為了看起來更容易辨認,可以在format格式部分使用諸如:之類的符號進行分隔
返回結果:
java.text.SimpleDateFormat@bcd152f3
// 返回的結果是這個類的名字 + 這個類的hash碼,因為沒有重寫toString()方法.
// 即getClass().getName() + "@" + Integer.toHexString(hashCode()) 

對三種時間日期常用類就介紹到這裡,
下面主要通過實際應用來了解這幾種類之間的相互轉換

首先介紹當前時間毫秒值的獲取方式

Long l = System.currentTimeMillis();
Long time = new Date().getTime();
Long millis = Calendar.getInstance().getTimeInMillis();

接下來就是各種的轉換過程:

1. Date型別轉變成對應時間的毫秒值

Date date = new Date();
SimpleDateFormat sdf =new SimpleDateFormat("yyMMddHHmm");
try {
    Date d = sdf.parse("1803170000");
    System.out.println(d.getTime());
    } catch (ParseException e) {
        e.printStackTrace();
    }

2.Calendar型別轉變成對應時間的毫秒值

Calendar calendar = Calendar.getInstance();
//這裡需要注意一下,calendar傳入的月份,是從0開始計數的(也就是說,2月相當於實際的三月)
calendar.set(2018, 2, 17); 
System.out.println(calendar.getTimeInMillis());

接下來介紹Date型別如何轉變成指定format格式的日期型別

首先回憶一下,Date型別本來是長這個樣子的:

Sat Mar 17 13:24:30 CST 2018

1.Date型別轉變成年月日時分秒的format格式

Date date = new Date();
SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(date));

轉換過後的結果是這樣的:

2018-03-17 13:28:41

從結果上看,還是挺美觀的吧~

可能我們平時還會有這樣的需求,要將普通的Date格式轉換成精確到秒的格式:
類似於這樣的20180317133112
表達的含義是2018年3月17日13時31分12秒
這種情況該如何做呢?

Date date = new Date();
SimpleDateFormat sdf =new SimpleDateFormat("yyyyMMddHHmmss");
System.out.println(sdf.format(date));

稍微調整一下format格式就可以做到啦!

Date型別和Calendar型別之間的相互轉換

1.Date型別轉換為Calendar型別

Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());    

2.Calendar型別轉換為Date型別

Calendar calendar = Calendar.getInstance();
calendar.getTime();

接下來介紹指定的String format格式轉變為Date,Calendar型別

1.String轉換為Date型別

String str="2018-3-17";
SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");
try {
    Date birthday = sdf.parse(str);
    System.out.println(birthday);
    } catch (ParseException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

執行完畢的結果是這樣的:

Sat Mar 17 00:00:00 CST 2018

2.String轉換為Calendar型別

String str="2018-3-17"; 
SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");
Date date = null;
try {
    date = sdf.parse(str);
    } catch (ParseException e) {
    e.printStackTrace();
    }
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
System.out.println(calendar);

幾個小的案例

工作中遇到的幾個小需求

1. 根據毫秒值來獲取當前的日期

/**
 * 根據時間的毫秒值來獲取當天的日期 日期格式 :yyyy-MM-dd
 * @param timeMillies(時間的毫秒值)
 * @return
 */
public static String getStringDate(Long timeMillies)
{
    Date date = new Date();
    date.setTime(timeMillies);
    SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd");
    return sdf.format(date);
}

2. 將毫秒格式的字串轉變成當前的秒數(也就是降低精度)

 /**
     * 將字串格式的時間轉為秒的值
     *
     * @param dateTime
     *            字串時間(格式:2018-08-29 23:59:46.08)
     * @return
     */
    public static Long getLongFromString(String dateTime) {
          try {
              /**
               * 將字串資料轉化為秒數
               */
              SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//24小時制
              if (dateTime == null || dateTime.equals(""))
              {
                  return null;
              }
              return simpleDateFormat.parse(dateTime).getTime();
         } catch (Exception e ) 
          {
             return null;
         }

做一個測試 : 
    Long l =getLongFromString("2018-08-30 00:00:03.500");
    Long l2 = getLongFromString("2018-08-30 00:01:03.600");
    System.out.println(l2 - l );
這兩個時間戳正常的結果應該是 相差: 60100毫秒
但是現在計算輸出的結果變成了 相差 : 60000毫秒
已經實現了該需求 ! 

3. 將給定的日期格式變成我們想要的日期格式

  /**
     * 將傳入的字串日期 標準化輸出
     * 傳入引數 : 20180830  結果 : 2018-08-30
     * @param str
     * @return
     */
    public static String getFormatDate(String str)
    {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); //傳入引數的format格式
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); //輸出結果的format格式
        try 
        {
            Date date = sdf.parse(str.trim());
            return dateFormat.format(date);
        } catch (ParseException e) 
        {
            return "";
        }
    }

如上:就是我能想到的一些互相轉換的方式了,
以後如果在工作中在應用到新的在持續進行更新,
希望能對大家有所幫助!