欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android關(guān)于獲取時間的記錄(小結(jié))

 更新時間:2019年04月15日 09:46:20   作者:PiscesYE  
這篇文章主要介紹了Android關(guān)于獲取時間的記錄(小結(jié)),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧

初涉江湖,還望海涵!
寫點東西,純粹是因為個人的記憶能力較弱,寫些筆記罷了,若有錯誤還望雅正!

對Android中的時間獲取做個記錄,以下為結(jié)果!

代碼粘貼

public class MainActivity extends AppCompatActivity {
 public static final String TAG = "MainActivity";
 
 @RequiresApi(api = Build.VERSION_CODES.CUPCAKE)
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  //timestamp
  TextView timestamp = findViewById(R.id.timestamp_show);
  timestamp.setText("timestamp:" + System.currentTimeMillis());
  //date
  Date date = new Date();
  TextView date_show = findViewById(R.id.date_show);
  date_show.setText("Date:" + date.toString());
  //Calendar
  TextView calendar_show = findViewById(R.id.calendar_show);
  Calendar calendar = Calendar.getInstance();
  int year = calendar.get(Calendar.YEAR);
  int month = calendar.get(Calendar.MONTH);
  int day = calendar.get(Calendar.DATE);
  int hour = calendar.get(Calendar.HOUR);
  int minute = calendar.get(Calendar.MINUTE);
  int second = calendar.get(Calendar.SECOND);
  String calendar_show_string = "Calendar:" + year + "-" + month + "-" + day
    + " " + hour + ":" + minute + ":" + second;
  calendar_show.setText(calendar_show_string);
  //Time
  TextView time_show = findViewById(R.id.time_show);
  Time time = new Time();
  time.setToNow();
  int time_year = time.year;
  int time_month = time.month;
  int time_day = time.monthDay;
  int time_hour = time.hour;
  int time_minute = time.minute;
  int time_second = time.second;
  String time_show_string = "Time:" + time_year + "-" + time_month + "-"
    + time_day + " " + time_hour + ":" + time_minute + ":" + time_second;
  time_show.setText(time_show_string);
  //SimpleDateFormat
  TextView simpleDateFormat_show = findViewById(R.id.simpleDateFormat_show);
  SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  String simpleDateFormat_tring = "SimpleDateFormat:" + format.format(new Date());
  simpleDateFormat_show.setText(simpleDateFormat_tring);
  Log.d(TAG, "onCreate: Long的最大值:" + Long.MAX_VALUE);

 }

根據(jù)自己使用過的以及網(wǎng)上搜索得到的結(jié)果,整理記錄了以下方法

1 timestamp
2 date
3 SimpleDateFormat
4 Calendar
5 Time

1 timestamp

 //timestamp
 TextView timestamp = findViewById(R.id.timestamp_show);
 timestamp.setText("timestamp:" + System.currentTimeMillis());

timestamp,時間戳。

使用時調(diào)用System類的currentTimeMillis()方法,該方法的描述是:

 /**
 * Returns the current time in milliseconds. Note that
 * while the unit of time of the return value is a millisecond,
 * the granularity of the value depends on the underlying
 * operating system and may be larger. For example, many
 * operating systems measure time in units of tens of
 * milliseconds.
 *
 * <p> See the description of the class <code>Date</code> for
 * a discussion of slight discrepancies that may arise between
 * "computer time" and coordinated universal time (UTC).
 *
 * @return the difference, measured in milliseconds, between
 *   the current time and midnight, January 1, 1970 UTC.
 * @see  java.util.Date
 */
 public static native long currentTimeMillis();

可以看出,該方法返回的是long類型的結(jié)果,結(jié)果記錄的是midnight, January 1, 1970 UTC至今經(jīng)過的毫秒數(shù)(milliseconds)。

System.currentTimeMillis()是一個native方法,是一個C/C++方法,由系統(tǒng)測量時間戳并返回測量結(jié)果,根據(jù)注釋描述,測量結(jié)果可能偏大,因為有些操作系統(tǒng)測量時間是以十毫秒為單位的,類Date中討論了關(guān)于系統(tǒng)時間和UTC時間產(chǎn)生差異的原因,可自行觀看!

Note:

  • UTC(coordinated universal time)是民用時間的標準,眾所周知,地球圍繞太陽公轉(zhuǎn)一周的時間定義為一年,地球自轉(zhuǎn)一周定義為一天。有科學(xué)報道說,地球漫長的公轉(zhuǎn)中其實是在緩慢的接近太陽,不管是否屬實,自轉(zhuǎn)和公轉(zhuǎn)會產(chǎn)生一些變化也是不可避免的,UTC就是正確測量時間的規(guī)則,當測量到需要校正時間時,會以毫秒為單位進行調(diào)整,稱之為閏秒(leap seconds),后面Time會提到!
  • System.currentTimeMillis()的返回結(jié)果是一個記錄從1970開始的毫秒數(shù)的long型結(jié)果,最容易想到的是long是有范圍區(qū)間的,如果有一天記錄的毫秒數(shù)超出long的范圍怎么辦!所以我計算了以下,long的最大值為0x7fff,ffff,ffff,ffff,取整大約為922億億,一年算365天,不考慮閏年,一天246060*60毫秒一年取整大約18億毫秒,922億/18,大約為50億年,考慮到太陽的壽命,貌似也有用盡的一天。。。。但是,那么長的時間,鬼知道會發(fā)展成什么樣!

2 Date

 //date
 Date date = new Date();
 TextView date_show = findViewById(R.id.date_show);
 date_show.setText("Date:" + date.toString());

通過實例化Date類獲取date實例從而獲取時間,簡單通過toString()打印結(jié)果

Date類的注釋特別描述了

日歷記時中,一年定為365天,閏年多一天,這表明,時間并不總是一天246060*60毫秒,需要用閏年加一天來調(diào)整。在coordinated universal time (UTC)的時間定義中,是通過閏秒(leap second)來調(diào)整時間的,并且總是在6月30日或12月31日,具體表現(xiàn)為該類對秒的限制在0 to 61,60和61發(fā)生在leap second時。

構(gòu)造函數(shù)

 public Date() {
  this(System.currentTimeMillis());
 }
 
 public Date(long date) {
  fastTime = date;
 }
 
 /**
  * @param year the year minus 1900.
  * @param month the month between 0-11.
  * @param date the day of the month between 1-31.
  * @param hrs  the hours between 0-23.
  * @param min  the minutes between 0-59.
  * @param sec  the seconds between 0-59.
  * @see  java.util.Calendar
  * @deprecated As of JDK version 1.1,
  * replaced by <code>Calendar.set(year + 1900, month, date,
  * hrs, min, sec)</code> or <code>GregorianCalendar(year + 1900,
  * month, date, hrs, min, sec)</code>.
  */
 @Deprecated
 public Date(int year, int month, int date, int hrs, int min, int sec) {
  int y = year + 1900;
  // month is 0-based. So we have to normalize month to support Long.MAX_VALUE.
  if (month >= 12) {
   y += month / 12;
   month %= 12;
  } else if (month < 0) {
   y += CalendarUtils.floorDivide(month, 12);
   month = CalendarUtils.mod(month, 12);
  }
  BaseCalendar cal = getCalendarSystem(y);
  cdate = (BaseCalendar.Date) cal.newCalendarDate(TimeZone.getDefaultRef());
  cdate.setNormalizedDate(y, month + 1, date).setTimeOfDay(hrs, min, sec, 0);
  getTimeImpl();
  cdate = null;
 }

無參大Date()直接把System.currentTimeMillis()的時間戳返回給fastTime,另一個就是設(shè)定好年月日時分秒來創(chuàng)建對象,其中的設(shè)定是年是1900+參數(shù)year并且也對月份超出范圍做出了處理,但是該構(gòu)造方法已是@Deprecated(棄用)了

Date類中大部分的方法都已經(jīng)棄用,要特別是單獨獲取年或者月等信息的方法,基本上都已經(jīng)棄用,留下的有打印即toString()和一些比較等功能性的方法

3 SimpleDateFormat

 //SimpleDateFormat
 TextView simpleDateFormat_show = findViewById(R.id.simpleDateFormat_show);
 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 String simpleDateFormat_tring = "SimpleDateFormat:" + format.format(new Date());
 simpleDateFormat_show.setText(simpleDateFormat_tring);

SimpleDateFormat類的核心是Text的formatting(格式化)和Time的parsing(解析),SimpleDateFormat()通過傳入一個字符串來格式化需要的表現(xiàn)形式,樣例中通過調(diào)用format()傳入Date無參對象,實際上是調(diào)用System.currentTimeMillis()獲取最基本的時間,SimpleDateFormat類的作用是把傳入的Date類時間定制化封裝,從而得到需要的結(jié)果。

Note:
關(guān)于SimpleDateFormat類,可以很自由的定制表現(xiàn)形式,年月日時分秒,時間格式,AD/BC。。。

定制化所用字母的含義:

  • G => AD/BC(年份為負數(shù)時),1+
  • y => Year,1+
  • Y => Week year,24+
  • M => Month in year,1+
  • w => Week in year,1+
  • W => Week in month,1+
  • D => Day in year,1+
  • d => Day in month,1+
  • F => Day of week in month,1+
  • E => Day name in week,1+
  • u => Day number of week(1 = Monday, ..., 7 = Sunday),24+
  • a => Am/pm marker,1+
  • H => Hour in day (0-23),1+
  • k => Hour in day (1-24),1+
  • K => Hour in am/pm (0-11),1+
  • h => Hour in am/pm (1-12),1+
  • m => Minute in hour,1+
  • s => Second in minute,1+
  • S => Millisecond,1+
  • z => Time zone:General time zone,PST,GMT-08:00,1+
  • Z => Time zone:RFC 822 time zone,1+
  • X => Time zone:ISO 8601 time zone,1+

定制化使用"字符串",在該字符串中使用'字符'表示在年月日等數(shù)據(jù)外的部分,如分隔符

SimpleDateFormat類的時間格式定制包括年月日等數(shù)據(jù)的表現(xiàn)形式,連接符,日期格式的描述,如Time zone,AM/PM,AD/BC。。。

SimpleDateFormat類中存在的問題是線程同步

/**
 * Date formats are not synchronized.
 * It is recommended to create separate format instances for each thread.
 * If multiple threads access a format concurrently, it must be synchronized
 * externally.
 */

SimpleDateFormat是線程不同步的,要在多線程中使用則要在線程外同步.

4 Calendar

 //Calendar
 TextView calendar_show = findViewById(R.id.calendar_show);
 Calendar calendar = Calendar.getInstance();
 int year = calendar.get(Calendar.YEAR);
 int month = calendar.get(Calendar.MONTH);
 int day = calendar.get(Calendar.DATE);
 int hour = calendar.get(Calendar.HOUR);
 int minute = calendar.get(Calendar.MINUTE);
 int second = calendar.get(Calendar.SECOND);
 String calendar_show_string = "Calendar:" + year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + second;
 calendar_show.setText(calendar_show_string);

Calendar是一個抽象類通過其內(nèi)定義的Calendar.getInstance()靜態(tài)方法實例化對象而該靜態(tài)方法最終是通過返回一個new GregorianCalendar(zone, aLocale)來實現(xiàn)初始化!

Calendar類內(nèi)部定義了關(guān)于時間需要用到的索引并用一個int數(shù)組存儲相關(guān)數(shù)據(jù)

 public final static int ERA = 0;
 public final static int YEAR = 1;
 public final static int MONTH = 2;
 public final static int WEEK_OF_YEAR = 3;
 ...
 @SuppressWarnings("ProtectedField")
 protected int fields[];

 public int get(int field)
 {
  complete();
  return internalGet(field);
 }
 
  protected final int internalGet(int field)
 {
  return fields[field];
 }

Calendar類的簡單實用就是通過調(diào)用get方法從數(shù)組中獲取相應(yīng)的數(shù)據(jù)

5 Time

//Time
 TextView time_show = findViewById(R.id.time_show);
 Time time = new Time();
 time.setToNow();
 int time_year = time.year;
 int time_month = time.month;
 int time_day = time.monthDay;
 int time_hour = time.hour;
 int time_minute = time.minute;
 int time_second = time.second;
 String time_show_string = "Time:" + time_year + "-" + time_month + "-" + time_day + " " + time_hour + ":" + time_minute + ":" + time_second;
 time_show.setText(time_show_string);

把這段代碼打入到剪輯器,你會看到Time這個類是棄用了的

官方的注釋解釋是這樣的

/**
 * An alternative to the {@link java.util.Calendar} and
 * {@link java.util.GregorianCalendar} classes. An instance of the Time class represents
 * a moment in time, specified with second precision. It is modelled after
 * struct tm. This class is not thread-safe and does not consider leap seconds.
 */

可以看到,描述上說,這是線程不安全的類,同時也沒有處理leap seconds(閏秒)的能力,還舉出了幾個例子。

雖然是棄用的方法,但是還是可以看看怎么使用Time類的,簡單地說,就是通過對象.變量的形式獲取,也就是說,Time不像Calendar類那樣使用數(shù)組存儲數(shù)據(jù),Time就是通過創(chuàng)建public int 數(shù)據(jù) 的形式來保存數(shù)據(jù),也就是這些數(shù)據(jù)都是public的

總的來說,獲取數(shù)據(jù)的時候,通過Time的形式,如int time_hour = time.hour;這樣的寫法,其實才是最舒服的(個人感覺),當然,最重要的還是安全問題

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android仿QQ長按刪除彈出框功能示例

    Android仿QQ長按刪除彈出框功能示例

    對于列表來說,如果想操作某個列表項,一般會采用長按彈出菜單的形式,默認的上下文菜單比較難看,而QQ的上下文菜單就人性化多了,整個菜單給用戶一種氣泡彈出的感覺,而且會顯示在手指按下的位置,接下來通過本文給大家分享Android仿QQ長按刪除彈出框功能,一起看看吧
    2017-03-03
  • Android仿微信單擊拍照長按錄像功能實例代碼

    Android仿微信單擊拍照長按錄像功能實例代碼

    這篇文章主要介紹了Android仿微信單擊拍照長按錄像功能實例代碼,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-04-04
  • Android Handler機制詳解原理

    Android Handler機制詳解原理

    Handler主要用于異步消息的處理:當發(fā)出一個消息之后,首先進入一個消息隊列,發(fā)送消息的函數(shù)即刻返回,而另外一個部分在消息隊列中逐一將消息取出,然后對消息進行處理,也就是發(fā)送消息和接收消息不是同步的處理。 這種機制通常用來處理相對耗時比較長的操作
    2021-11-11
  • Android基礎(chǔ)之startActivityForResult()的用法詳解

    Android基礎(chǔ)之startActivityForResult()的用法詳解

    這篇文章主要給大家介紹了Android中startActivityForResult()的用法,文中給出了詳細的介紹與示例代碼,相信對大家的理解和學(xué)習具有一定參考借鑒價值,有需要的朋友們下面來一起看看吧。
    2017-01-01
  • Android布局中margin與padding的區(qū)別及說明

    Android布局中margin與padding的區(qū)別及說明

    這篇文章主要介紹了Android布局中margin與padding的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • PopupWindow+RecyclerView實現(xiàn)上下滑動框功能

    PopupWindow+RecyclerView實現(xiàn)上下滑動框功能

    這篇文章主要為大家詳細介紹了PopupWindow+RecyclerView實現(xiàn)上下滑動框功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Android中FoldingLayout折疊布局的用法及實戰(zhàn)全攻略

    Android中FoldingLayout折疊布局的用法及實戰(zhàn)全攻略

    這篇文章主要介紹了Android中FoldingLayout折疊布局的用法及實例,通過FoldingLayout我們可以制作出炫酷的菜單折疊效果,文中的例子講解得非常詳細,需要的朋友可以參考下
    2016-02-02
  • Android控件ViewFlipper仿淘寶頭條垂直滾動廣告條

    Android控件ViewFlipper仿淘寶頭條垂直滾動廣告條

    這篇文章主要為大家詳細介紹了Android控件ViewFlipper仿淘寶頭條垂直滾動廣告條,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Android實現(xiàn)讀取SD卡下所有TXT文件名并用listView顯示出來的方法

    Android實現(xiàn)讀取SD卡下所有TXT文件名并用listView顯示出來的方法

    這篇文章主要介紹了Android實現(xiàn)讀取SD卡下所有TXT文件名并用listView顯示出來的方法,涉及Android針對SD卡的讀取及文件遍歷等相關(guān)操作技巧,需要的朋友可以參考下
    2017-06-06
  • Kotlin自定義View系列教程之標尺控件(選擇身高、體重等)的實現(xiàn)

    Kotlin自定義View系列教程之標尺控件(選擇身高、體重等)的實現(xiàn)

    這篇文章主要給大家介紹了關(guān)于Kotlin自定義View系列教程之標尺控件(選擇身高、體重等)實現(xiàn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習學(xué)習吧
    2018-07-07

最新評論