Android中Calendar类的用法总结

Calendar是Android开发中需要获取时间时必不可少的一个工具类,通过这个类可以获得的时间信息还是很丰富的,下面做一个总结,以后使用的时候就不用总是去翻书或者查资料了。

在获取时间之前要先获得Calendar这个类的实例:

[java] view plain copy

  1. private Calendar c = Calendar.getInstance();

然后就可以用这个变量来获取时间了。

获得当前的年份

[java] view plain copy

  1. Log.i("MainActivityFilter", "当前的年份为:" + c.get(Calendar.YEAR));

获得当前的月份

[java] view plain copy

  1. Log.i("MainActivityFilter", "当前的月份为:" + (c.get(Calendar.MONTH) + 1));

这个要特别注意一下,月份在Calendar中是从0开始的,也就是说1月份的值为0,因此需要加1才是现实中表示的月份

获得今天是本月的第几天,有两种写法,结果是一样的

[java] view plain copy

  1. Log.i("MainActivityFilter", "DATE:" + c.get(Calendar.DATE));
  2. Log.i("MainActivityFilter", "DAY_OF_MONTH:" + c.get(Calendar.DAY_OF_MONTH));

获得今天是本年的第几天

[java] view plain copy

  1. Log.i("MainActivityFilter", "今天是今年的第" + c.get(Calendar.DAY_OF_YEAR) + "天");

获得今天在本月的第几周

[java] view plain copy

  1. Log.i("MainActivityFilter", "今天在本月的第" + c.get(Calendar.DAY_OF_WEEK_IN_MONTH) + "周");

获得今天是周几,这里不能直接将返回值当做周几,而应该与Calendar用于表示周几的常量搭配使用,返回值为3不代表今天是周三

[java] view plain copy

  1. private void printDayOfWeek() {
  2. switch (c.get(Calendar.DAY_OF_WEEK)) {
  3. case Calendar.SUNDAY:
  4. Log.i("MainActivityFilter", "今天是周日");
  5. break;
  6. case Calendar.MONDAY:
  7. Log.i("MainActivityFilter", "今天是周一");
  8. break;
  9. case Calendar.TUESDAY:
  10. Log.i("MainActivityFilter", "今天是周二");
  11. break;
  12. case Calendar.WEDNESDAY:
  13. Log.i("MainActivityFilter", "今天是周三");
  14. break;
  15. case Calendar.THURSDAY:
  16. Log.i("MainActivityFilter", "今天是周四");
  17. break;
  18. case Calendar.FRIDAY:
  19. Log.i("MainActivityFilter", "今天是周五");
  20. break;
  21. case Calendar.SATURDAY:
  22. Log.i("MainActivityFilter", "今天是周六");
  23. break;
  24. default:
  25. break;
  26. }
  27. }

获得今天是几点,12小时制

[java] view plain copy

  1. Log.i("MainActivityFilter", "现在是" + c.get(Calendar.HOUR) + "点");

但现在其实是下午三点,所以需要区分是上午还是下午

[java] view plain copy

  1. if (c.get(Calendar.AM_PM) == Calendar.AM) {
  2. Log.i("MainActivityFilter", "现在是上午");
  3. } else {
  4. Log.i("MainActivityFilter", "现在是下午");
  5. }

使用Calendar.AM和Calendar.PM来帮助判断是上午还是下午,如果c.get(Calendar.AM_PM)获取到的值和Calendar.AM相等就是上午,如果和Calendar.PM相等就是下午

Calendar也提供了获取24小时制时间的方法

[java] view plain copy

  1. Log.i("MainActivityFilter", "现在是" + c.get(Calendar.HOUR_OF_DAY) + "点");

获得现在是几分

[java] view plain copy

  1. Log.i("MainActivityFilter", "现在是" + c.get(Calendar.MINUTE) + "分");

获得现在是几秒

[java] view plain copy

  1. Log.i("MainActivityFilter", "现在是" + c.get(Calendar.SECOND) + "秒");

获得现在是几毫秒

[java] view plain copy

  1. Log.i("MainActivityFilter", "现在是" + c.get(Calendar.MILLISECOND) + "毫秒");

Calendar虽然不提供显示规范格式时间的方法,但是可以用SimpleDateFormat来输出规范的字符串,这里简单示范一下用法

[java] view plain copy

  1. SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
  2. Log.i("MainActivityFilter", sdf.format(c.getTime()));

关于SimpleDateFormat的更详细的用法之后会用另外一篇文章来讲

Calendar还提供了一些其它的方法,接下来关于时间的输出都是用SimpleDateFormat来输出的,就不贴输出的代码了。

增加日期中的某个域的值,比如想获得明天的日期,就需要向DAY域加1

[java] view plain copy

  1. c.add(Calendar.DAY_OF_MONTH, 1);

加之前

加之后

这样对程序员就比较方便,不用去考虑各种界限的问题

比较两个日期是否相等

[java] view plain copy

  1. private Calendar c = Calendar.getInstance();
  2. private Calendar d = Calendar.getInstance();

[java] view plain copy

  1. Log.i("MainActivityFilter", "c和d是否相等:" + c.equals(d));
  2. c.add(Calendar.YEAR, 1);
  3. Log.i("MainActivityFilter", "c和d是否相等:" + c.equals(d));

比较两个日期哪个更靠后一些

[java] view plain copy

  1. private Calendar c = Calendar.getInstance();
  2. private Calendar d = Calendar.getInstance();
  3. private SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm");

[java] view plain copy

  1. d.add(Calendar.DAY_OF_MONTH, 1);
  2. Log.i("MainActivityFilter", "d在c后面:" + d.after(c));

同样,有方法可以用来判断两个日期哪个更靠前

[java] view plain copy

  1. Log.i("MainActivityFilter", "c在d前面:" + c.before(d));

清空某一个域并用这个域最小的值代替和清空所有的域然后全部用最小的值代替

[java] view plain copy

  1. c.clear(Calendar.MONTH);
  2. d.clear();
  3. Log.i("MainActivityFilter", "c:" + sdf.format(c.getTime()));
  4. Log.i("MainActivityFilter", "d:" + sdf.format(d.getTime()));

获得Calendar对象的一个深拷贝

[java] view plain copy

  1. d = (Calendar) c.clone();
  2. Log.i("MainActivityFilter", "c:" + sdf.format(c.getTime()));
  3. Log.i("MainActivityFilter", "d:" + sdf.format(d.getTime()));
  4. c.add(Calendar.YEAR, 1);
  5. Log.i("MainActivityFilter", "c:" + sdf.format(c.getTime()));
  6. Log.i("MainActivityFilter", "d:" + sdf.format(d.getTime()));

比较两个Calendar哪个在前哪个在后的方法

如果调用这个方法的Calendar实例比参数给出的Calendar实例要靠前一些,返回-1,如果要靠后一些,返回1,如果相等,返回0

[java] view plain copy

  1. d = (Calendar) c.clone();
  2. Log.i("MainActivityFilter", "比较的结果:" + c.compareTo(d));
  3. c.add(Calendar.YEAR, 1);
  4. Log.i("MainActivityFilter", "比较的结果:" + c.compareTo(d));
  5. d.add(Calendar.YEAR, 2);
  6. Log.i("MainActivityFilter", "比较的结果:" + c.compareTo(d));

将当前Calendar对象转换为Date对象

为Calendar对象的域设置值的一些方法

还有将Date对象设置给Calendar对象的方法

Calendar还提供了一些关于时区,地域方面的方法,还有一些奇怪的方法,比如获取某个Calendar所处的时间是公元前还是公元后的方法。。。这些方法如果以后在实战中有运用到,再来更新这篇文章。

本篇文章中所使用到的部分代码已经上传至github,地址:https://github.com/sysukehan/AndroidTests.Git,为android Studio项目,其中的CalendarTest模块包含本文使用的代码。

时间: 2024-08-10 07:35:15

Android中Calendar类的用法总结的相关文章

android中Handle类的用法

android中Handle类的用法 当我们在处理下载或是其他需要长时间执行的任务时,如果直接把处理函数放Activity的OnCreate或是OnStart中,会导致执行过程中整个Activity无响应,如果时间过长,程序还会挂掉.Handler就是把这些功能放到一个单独的线程里执行,与Activity互不影响. 当用户点击一个按钮时如果执行的是一个常耗时操作的话,处理不好会导致系统假死,用户体验很差,而Android则更进一步,如果任意一个Acitivity没有响应5秒钟以上就会被强制关闭,

三、android中Handle类的用法

当我们在处理下载或是其他需要长时间执行的任务时,如果直接把处理函数放Activity的OnCreate或是OnStart中,会导致执行过程中整个Activity无响应,如果时间过长,程序还会挂掉.Handler就是把这些功能放到一个单独的线程里执行,与Activity互不影响. 当用户点击一个按钮时如果执行的是一个常耗时操作的话,处理不好会导致系统假死,用户体验很差,而Android则更进一步,如果任意一个Acitivity没有响应5秒钟以上就会被强制关闭,因此我们需要另外起动一个线程来处理长耗

android中MediaPlayer类的用法

用法直接看sample package com.turtle920.androidaudioprocess; import android.media.MediaPlayer; import android.os.Environment; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; impo

Android中AsyncTask的简单用法【转】

在开发Android移动客户端的时候往往要使用多线程来进行操作,我们通常会将耗时的操作放在单独的线程执行,避免其占用主线程而给用户带来不好的用户体验.但是在子线程中无法去操作主线程(UI 线程),在子线程中操作UI线程会出现错误.因此android提供了一个类Handler来在子线程中来更新UI线程,用发消息的机制更新UI界面,呈现给用户.这样就解决了子线程更新UI的问题.但是费时的任务操作总会启动一些匿名的子线程,太多的子线程给系统带来巨大的负担,随之带来一些性能问题.因此android提供了

Android中各种Adapter的用法

1.概念 Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带.在常见的View(ListView,GridView)等地方都需要用到Adapter.如下图直观的表达了Data.Adapter.View三者的关系: Android中所有的Adapter一览: 由图可以看到在Android中与Adapter有关的所有接口.类的完整层级图.在我们使用过程中可以根据自己的需求实现接口或者继承类进行一定的扩展.比较常用的有 BaseAdapter,SimpleA

Android技术18:Android中Adapter类详解

1.Adapter设计模式 Android中adapter接口有很多种实现,例如,ArrayAdapter,BaseAdapter,CursorAdapter,SimpleAdapter,SimpleCursorAdapter等,他们分别对应不同的数据源.例如,ArrayAdater对应List和数组数据源,而CursorAdapter对应Cursor对象(一般从数据库中获取的记录集).这些Adapter都需要getView方法返回当前列表项显示的View对象.当Model发生改变时,会调用Ba

【Android】Android中Service类onStartCommand的返回值有关问题(转)

@Override public int onStartCommand(Intent intent, int flags, int startId) { System.out.println("---------->>onStartCommand2"); return super.onStartCommand(intent, flags, startId); } Android开发的过程中,每次调用startService(Intent)的时候,都会调用该Service对象

Android中View类OnClickListener和DialogInterface类OnClickListener冲突解决办法

如下面所示,同时导入这两个,会提示其中一个与另一个产生冲突. 1 import android.view.View.OnClickListener; 2 import android.content.DialogInterface.OnClickListener; 其实,当我们用某个Listener时,不一定就要import它,直接用全名去定义就不需要import了,例如 1 mButton1.setOnClickListener(new OnClickListener() 2 { 3 4 @O

C#中timer类的用法

C#中timer类的用法 关于C#中timer类  在C#里关于定时器类就有3个   1.定义在System.Windows.Forms里   2.定义在System.Threading.Timer类里   3.定义在System.Timers.Timer类里 System.Windows.Forms.Timer是应用于WinForm中的,它是通过Windows消息机制实现的,类似于VB或Delphi中的Timer控件,内部使用API  SetTimer实现的.它的主要缺点是计时不精确,而且必须