基於Android一些時間創建的基本概念
獲取當前時間
方式一:
Date date = new Date(); Log.e(TAG, "當前時間="+date);
結果:
E/TimeActivity: 當前時間=Wed Sep 12 07:03:25 GMT+00:00 2018
方式二:
long date = System.currentTimeMillis(); //獲得系統時間,得到是從1970年到現在的毫秒級long值 Log.e(TAG, "毫秒級time值=:"+date);
結果:
E/TimeActivity: 毫秒級time值=:1536736055737
方法三:
Calendar calendar = Calendar.getInstance();
calendar.getTimeInMillis();
獲取設備開機至此時的相對時間
long time = SystemClock.elapsedRealtime();
獲取休眠喚醒后到此時的相對時間
SystemClock.uptimeMillis();
SimpleDateFormat 格式化時間
格式化字母表
Symbol | Meaning | Presentation | Example |
---|---|---|---|
G | era designator 時代 | Text | AD |
y | year 年 | Number | 2009 |
M | month in year 月 | Text & Number | July & 07 |
d | day in month 日 | Number | 10 |
h | hour in am/pm (1-12) 12小時制的時 | Number | 12 |
H | hour in day (0-23) 24小時制的時 | Number | 0 |
m | minute in hour 分鍾 | Number | 30 |
s | second in minute 秒 | Number | 55 |
S | millisecond 毫秒 | Number | 978 |
E | day in week 星期 | Text | Tuesday |
D | day in year 一年中的第幾天 | Number | 189 |
F | day of week in month 一個月中的第幾周的星期幾 | Number | 2 (2nd Wed in July) |
w | week in year 一年中的第幾周 | Number | 27 |
W | week in month 一月中的第幾周 | Number | 2 |
a | am/pm marker 上午/下午 | Text | PM |
k | hour in day (1-24) 一天中的第幾個小時 | Number | 24 |
K | hour in am/pm (0-11) | Number | 0 |
z | time zone 時區 | Text | Pacific Standard Time |
' | escape for text | Delimiter | (none) |
' | single quote | Literal | ' |
字符串轉時間戳
String str = "2019-03-13 13:54:00"; SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = simpleDateFormat.parse(str); long ts = date.getTime(); System.out.println(ts);
時間戳轉字符串
格式化出全部的時間:
long time = System.currentTimeMillis(); //格式化 日-月(3個M等於文本形式的月份)-年 小時:分鍾:秒:毫秒 SimpleDateFormat formatter = new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss:SSS"); String timeText = formatter.format(time); Log.e(TAG, "格式化后time值=:"+timeText);
結果:
E/TimeActivity: 格式化后time值=:12-Sep-2018 07:22:38:596
只格式化時-分-秒-毫秒:
SimpleDateFormat formatter = new SimpleDateFormat("HH-mm-ss-SSS");//分隔符是可以自己設定的 Log.e(TAG, "格式化后time值=:"+formatter.format(System.currentTimeMillis()));
結果:
E/TimeActivity: 格式化后time值=:07-29-18-317
格式化一個月中第幾周:
SimpleDateFormat formatter = new SimpleDateFormat("M-W");//月份-月份中的第幾周 //如果是"MM-WW" 則可以格式化出 09-03 Log.e(TAG, "格式化后time值=:"+formatter.format(System.currentTimeMillis()));
結果:
E/TimeActivity: 格式化后time值=:9-3
Calendar 歷法類
例一:
mFormat = new SimpleDateFormat("yyyy-MM-dd:HH-mm-ss"); Calendar calendar = Calendar.getInstance();//得到單例 calendar.set(Calendar.YEAR,2018);//年 calendar.set(Calendar.MONTH,8);//月 注意月份是從0開始計算的,所以這里的8,在格式化后等於9 calendar.set(Calendar.DAY_OF_MONTH,12);//日 calendar.set(Calendar.HOUR_OF_DAY,15);// HOUR_OF_DAY 24小時制的時 calendar.set(Calendar.MINUTE,52);//分 calendar.set(Calendar.SECOND,20);//秒 Log.e(TAG, "未格式化毫秒級time="+calendar.getTimeInMillis()); Log.e(TAG, "手動格式化time="+mFormat.format(calendar.getTimeInMillis())); Log.e(TAG, "系統自帶格式化time="+calendar.getTime());
效果:
E/TimeActivity: 未格式化毫秒級time=1536767540133
E/TimeActivity: 手動格式化time=2018-09-12:15-52-20 E/TimeActivity: 系統自帶格式化time=Wed Sep 12 15:52:20 GMT+00:00 2018
例二:
calendar.set(2017,9,13,14,24,30);
Log.e(TAG, "另一種方式輸入方式time="+mFormat.format(calendar.getTimeInMillis()));
效果 :
E/TimeActivity: 另一種方式輸入方式time=2017-10-13:14-24-30
例三:
calendar.set(Calendar.AM_PM,0);// 0=上午 1=下午 calendar.set(Calendar.HOUR,6);//12小時值 Log.e(TAG, "上午time="+mFormat.format(calendar.getTimeInMillis())); calendar.set(Calendar.AM_PM,1); calendar.set(Calendar.HOUR,7); Log.e(TAG, "下午time="+mFormat.format(calendar.getTimeInMillis()));
效果:
E/TimeActivity: 上午time=2017-10-13:06-24-30
E/TimeActivity: 下午time=2017-10-13:19-24-30
使用Calendar向上或向下跳轉年/月/日/時/分/秒
日期的切換還相當簡單只需要當前時間戳減去24小時時間戳,年份或月份的切換是需要相當復雜的計算的,需要計算大小月/平潤年.好在Calendar類已經幫我們實現了這個方法
add()方法:
說明一下add()方法,使用add()方法切換時間,會影響到其他區域的時間(增加減少日期的同時會改變月份或者年份),例如:2018-11-31(這里是11等於12),我們切換增加一天時間就會變成2019-0-1
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.YEAR,-1);//減少一年 calendar.add(Calendar.YEAR,1);//增加一年 calendar.add(Calendar.MONTH,-1);//減少一個月 calendar.add(Calendar.MONTH,1);//增加一個月 calendar.add(Calendar.DAY_OF_MONTH,-1);//減少一天 calendar.add(Calendar.DAY_OF_MONTH,1);//增加一天
roll()方法:
roll()方法正好與add()相反,使用roll()方法切換時間,不會影響到其他區域的時間,例如:2018-11-31,我們切換增加一天時間就會變成2018-11-1
Calendar calendar = Calendar.getInstance();
calendar.roll(Calendar.YEAR,-1);//減少一年 calendar.roll(Calendar.YEAR,1);//增加一年 calendar.roll(Calendar.MONTH,-1);//減少一個月 calendar.roll(Calendar.MONTH,1);//增加一個月 calendar.roll(Calendar.DAY_OF_MONTH,-2);//減少2天 calendar.roll(Calendar.DAY_OF_MONTH,2);//增加2天 //當然也可以使用布爾值 calendar.roll(Calendar.YEAR,true);//減少一年 calendar.roll(Calendar.YEAR,false);//增加一年 calendar.roll(Calendar.MONTH,true);//減少一個月 calendar.roll(Calendar.MONTH,false);//增加一個月 calendar.roll(Calendar.DAY_OF_MONTH,true);//減少一天 calendar.roll(Calendar.DAY_OF_MONTH,false);//增加一天
使用Calendar得到時間
Calendar cal = Calendar.getInstance();
//當前年 int year = cal.get(Calendar.YEAR); Log.e(TAG, "當前年:"+year); //當前月 int month = (cal.get(Calendar.MONTH))+1; Log.e(TAG, "當前月:"+month); //當前月的第幾天:即當前日 int day_of_month = cal.get(Calendar.DAY_OF_MONTH); Log.e(TAG, "當前月:"+day_of_month); //當前時:HOUR_OF_DAY-24小時制;HOUR-12小時制 int hour = cal.get(Calendar.HOUR_OF_DAY); Log.e(TAG, "當前時:"+hour); //當前分 int minute = cal.get(Calendar.MINUTE); Log.e(TAG, "當前分:"+minute); //當前秒 int second = cal.get(Calendar.SECOND); Log.e(TAG, "當前秒:"+second); //當前毫秒 int millisecond = calendar.get(Calendar.MILLISECOND); Log.e(TAG, "當前毫秒:"+millisecond); //0-上午;1-下午 int ampm = cal.get(Calendar.AM_PM); Log.e(TAG, "上午/下午:"+ampm); //當前年的第幾周 int week_of_year = cal.get(Calendar.WEEK_OF_YEAR); Log.e(TAG, "當前年的第幾周:"+week_of_year); //當前月的第幾周 int week_of_month = cal.get(Calendar.WEEK_OF_MONTH); Log.e(TAG, "當前月的第幾周:"+week_of_month); //當前年的第幾天 int day_of_year = cal.get(Calendar.DAY_OF_YEAR); Log.e(TAG, "當前年的第幾天:"+day_of_year);
另外解釋為什么int month = (cal.get(Calendar.MONTH))+1; 需要加+1,因為這個獲取的月份值是從0開始的