初涉江湖,还望海涵!
写点东西,纯粹是因为个人的记忆能力较弱,写些笔记罢了,若有错误还望雅正!

对Android中的时间获取做个记录,以下为结果!

代码粘贴

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);

 }

根据自己使用过的以及网上搜索得到的结果,整理记录了以下方法

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,时间戳。

使用时调用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类型的结果,结果记录的是midnight, January 1, 1970 UTC至今经过的毫秒数(milliseconds)。

System.currentTimeMillis()是一个native方法,是一个C/C 方法,由系统测量时间戳并返回测量结果,根据注释描述,测量结果可能偏大,因为有些操作系统测量时间是以十毫秒为单位的,类Date中讨论了关于系统时间和UTC时间产生差异的原因,可自行观看!

Note:

  • UTC(coordinated universal time)是民用时间的标准,众所周知,地球围绕太阳公转一周的时间定义为一年,地球自转一周定义为一天。有科学报道说,地球漫长的公转中其实是在缓慢的接近太阳,不管是否属实,自转和公转会产生一些变化也是不可避免的,UTC就是正确测量时间的规则,当测量到需要校正时间时,会以毫秒为单位进行调整,称之为闰秒(leap seconds),后面Time会提到!
  • System.currentTimeMillis()的返回结果是一个记录从1970开始的毫秒数的long型结果,最容易想到的是long是有范围区间的,如果有一天记录的毫秒数超出long的范围怎么办!所以我计算了以下,long的最大值为0x7fff,ffff,ffff,ffff,取整大约为922亿亿,一年算365天,不考虑闰年,一天246060*60毫秒一年取整大约18亿毫秒,922亿/18,大约为50亿年,考虑到太阳的寿命,貌似也有用尽的一天。。。。但是,那么长的时间,鬼知道会发展成什么样!

2 Date

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

通过实例化Date类获取date实例从而获取时间,简单通过toString()打印结果

Date类的注释特别描述了

日历记时中,一年定为365天,闰年多一天,这表明,时间并不总是一天246060*60毫秒,需要用闰年加一天来调整。在coordinated universal time (UTC)的时间定义中,是通过闰秒(leap second)来调整时间的,并且总是在6月30日或12月31日,具体表现为该类对秒的限制在0 to 61,60和61发生在leap second时。

构造函数

 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,另一个就是设定好年月日时分秒来创建对象,其中的设定是年是1900 参数year并且也对月份超出范围做出了处理,但是该构造方法已是@Deprecated(弃用)了

Date类中大部分的方法都已经弃用,要特别是单独获取年或者月等信息的方法,基本上都已经弃用,留下的有打印即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()通过传入一个字符串来格式化需要的表现形式,样例中通过调用format()传入Date无参对象,实际上是调用System.currentTimeMillis()获取最基本的时间,SimpleDateFormat类的作用是把传入的Date类时间定制化封装,从而得到需要的结果。

Note:
关于SimpleDateFormat类,可以很自由的定制表现形式,年月日时分秒,时间格式,AD/BC。。。

定制化所用字母的含义:

  • G => AD/BC(年份为负数时),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

定制化使用"字符串",在该字符串中使用'字符'表示在年月日等数据外的部分,如分隔符

SimpleDateFormat类的时间格式定制包括年月日等数据的表现形式,连接符,日期格式的描述,如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是一个抽象类通过其内定义的Calendar.getInstance()静态方法实例化对象而该静态方法最终是通过返回一个new GregorianCalendar(zone, aLocale)来实现初始化!

Calendar类内部定义了关于时间需要用到的索引并用一个int数组存储相关数据

 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类的简单实用就是通过调用get方法从数组中获取相应的数据

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类那样使用数组存储数据,Time就是通过创建public int 数据 的形式来保存数据,也就是这些数据都是public的

总的来说,获取数据的时候,通过Time的形式,如int time_hour = time.hour;这样的写法,其实才是最舒服的(个人感觉),当然,最重要的还是安全问题

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持Devmax。

Android关于获取时间的记录(小结)的更多相关文章

  1. html5 canvas合成海报所遇问题及解决方案总结

    这篇文章主要介绍了html5 canvas合成海报所遇问题及解决方案总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. Html5 video标签视频的最佳实践

    这篇文章主要介绍了Html5 video标签视频的最佳实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  3. HTML5在微信内置浏览器下右上角菜单的调整字体导致页面显示错乱的问题

    HTML5在微信内置浏览器下,在右上角菜单的调整字体导致页面显示错乱的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

  4. ios – containerURLForSecurityApplicationGroupIdentifier:在iPhone和Watch模拟器上给出不同的结果

    我使用默认的XCode模板创建了一个WatchKit应用程序.我向iOSTarget,WatchkitAppTarget和WatchkitAppExtensionTarget添加了应用程序组权利.(这是应用程序组名称:group.com.lombax.fiveminutes)然后,我尝试使用iOSApp和WatchKitExtension访问共享文件夹URL:延期:iOS应用:但是,测试NSURL

  5. Ionic – Splash Screen适用于iOS,但不适用于Android

    我有一个离子应用程序,其中使用CLI命令离子资源生成的启动画面和图标iOS版本与正在渲染的启动画面完美配合,但在Android版本中,只有在加载应用程序时才会显示白屏.我检查了config.xml文件,所有路径看起来都是正确的,生成的图像出现在相应的文件夹中.(我使用了splash.psd模板来生成它们.我错过了什么?这是config.xml文件供参考,我觉得我在这里做错了–解决方法在config.xml中添加以下键:它对我有用!

  6. ios – 无法启动iPhone模拟器

    /Library/Developer/CoreSimulator/Devices/530A44CB-5978-4926-9E91-E9DBD5BFB105/data/Containers/Bundle/Application/07612A5C-659D-4C04-ACD3-D211D2830E17/ProductName.app/ProductName然后,如果您在Xcode构建设置中选择标准体系结构并再次构建和运行,则会产生以下结果:dyld:lazysymbolbindingFailed:Symbol

  7. Xamarin iOS图像在Grid内部重叠

    heyo,所以在Xamarin我有一个使用并在其中包含一对,所有这些都包含在内.这在Xamarin.Android中看起来完全没问题,但是在Xamarin.iOS中,图像与标签重叠.我不确定它的区别是什么–为什么它在Xamarin.Android中看起来不错但在iOS中它的全部都不稳定?

  8. 在iOS上向后播放HTML5视频

    我试图在iPad上反向播放HTML5视频.HTML5元素包括一个名为playbackRate的属性,它允许以更快或更慢的速率或相反的方式播放视频.根据Apple’sdocumentation,iOS不支持此属性.通过每秒多次设置currentTime属性,可以反复播放,而无需使用playbackRate.这种方法适用于桌面Safari,但似乎在iOS设备上的搜索限制为每秒1次更新–在我的情况下太慢了.有没有办法在iOS设备上向后播放HTML5视频?解决方法iOS6Safari现在支持playbackRat

  9. 使用 Swift 语言编写 Android 应用入门

    Swift标准库可以编译安卓armv7的内核,这使得可以在安卓移动设备上执行Swift语句代码。做梦,虽然Swift编译器可以胜任在安卓设备上编译Swift代码并运行。这需要的不仅仅是用Swift标准库编写一个APP,更多的是你需要一些框架来搭建你的应用用户界面,以上这些Swift标准库不能提供。简单来说,构建在安卓设备上使用的Swiftstdlib需要libiconv和libicu。通过命令行执行以下命令:gitclonegit@github.com:SwiftAndroid/libiconv-libi

  10. Android – 调用GONE然后VISIBLE使视图显示在错误的位置

    我有两个视图,A和B,视图A在视图B上方.当我以编程方式将视图A设置为GONE时,它将消失,并且它正下方的视图将转到视图A的位置.但是,当我再次将相同的视图设置为VISIBLE时,它会在视图B上显示.我不希望这样.我希望视图B回到原来的位置,这是我认为会发生的事情.我怎样才能做到这一点?编辑–代码}这里是XML:解决方法您可以尝试将两个视图放在RelativeLayout中并相对于彼此设置它们的位置.

随机推荐

  1. Flutter 网络请求框架封装详解

    这篇文章主要介绍了Flutter 网络请求框架封装详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. Android单选按钮RadioButton的使用详解

    今天小编就为大家分享一篇关于Android单选按钮RadioButton的使用详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

  3. 解决android studio 打包发现generate signed apk 消失不见问题

    这篇文章主要介绍了解决android studio 打包发现generate signed apk 消失不见问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  4. Android 实现自定义圆形listview功能的实例代码

    这篇文章主要介绍了Android 实现自定义圆形listview功能的实例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. 详解Android studio 动态fragment的用法

    这篇文章主要介绍了Android studio 动态fragment的用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. Android用RecyclerView实现图标拖拽排序以及增删管理

    这篇文章主要介绍了Android用RecyclerView实现图标拖拽排序以及增删管理的方法,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下

  7. Android notifyDataSetChanged() 动态更新ListView案例详解

    这篇文章主要介绍了Android notifyDataSetChanged() 动态更新ListView案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

  8. Android自定义View实现弹幕效果

    这篇文章主要为大家详细介绍了Android自定义View实现弹幕效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  9. Android自定义View实现跟随手指移动

    这篇文章主要为大家详细介绍了Android自定义View实现跟随手指移动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. Android实现多点触摸操作

    这篇文章主要介绍了Android实现多点触摸操作,实现图片的放大、缩小和旋转等处理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部