Calendar.get(Calendar.HOUR)问题

Jon*_*ins 6 android calendar android-calendar

我正在尝试在我的应用程序最后更新时显示在TextView中(例如,"上次更新时间为12:13).我正在尝试使用Calendar实例,我认为我理解正确,但我似乎遇到了麻烦.我知道获取一个实例我使用Calendar.getInstance()方法.然后得到我使用Calendar.get(Calendar.HOUR)和Calendar.get(Calendar.MINUTE)的小时和分钟.我的分钟字段正确返回但是日历.HOUR小时24小时回来,我想要一个12小时的时钟.我觉得HOUR_OF_DAY是24小时制.我哪里错了?

这是我正在使用的代码:

Calendar rightNow = Calendar.getInstance();
mTv.setText("Refreshed! Last updated " + 
           rightNow.get(Calendar.HOUR) + ":" + 
           rightNow.get(Calendar.MINUTE) + ".");
Run Code Online (Sandbox Code Playgroud)

mTv是我正在更新的TextView.谢谢你的帮助.

此外,如果我能说"最近更新5分钟前",那将是理想的选择.而不是"最后更新时间为下午12:13".但是我不确定每分钟都有这种更新的最佳方法,而不会耗尽资源或电池......?

小智 8

我建议将SimpleDateFormat与Date类结合使用以格式化时间:

Date now = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("K:mm a");
String formattedTime = sdf.format(now);
Run Code Online (Sandbox Code Playgroud)

简短解释它是如何工作的:你创建一个SimpleDateFormat对象并将一个String传递给它的construtor,它告诉它如何格式化每个传递给它的format()函数的时间/日期对象.有很多常量/字母代表一个特殊的时间对象(例如,秒,AM/PM标记,..请参阅完整列表的类文档).

"K:mm a"表示"11:42 AM"格式 - 小时的一个或两个数字(取决于其值),12小时格式,总是两位数分钟(mm)和AM或PM(a ),取决于时间.

完成后,只需将Date对象传递给format()函数,您将获得一个格式化的字符串.请注意,Date只保存一个时间点,如果从没有参数的构造函数创建它("= new Date()"),它将使用当前时间.如果你需要另一次,你可以用millis传递一个长参数,你可以从Calendar.getTimeInMillis()获得.

在实施"更新的XY分钟前功能"时 - 是的,你必须每分钟更新一次,你必须计算更新和当前时间之间的差异.我认为从电池和额外的工作角度来看它是不值得的.如果您的应用程序使用标准的短更新周期(例如,每小时或沿着这些线路的某些东西)并且不是全屏,则用户在其屏幕的顶部/底部具有可见时钟.如果他真的想检查自更新以来有多长时间,他可以看一看并进行比较(大多数只是几分钟或几小时/分钟).恕我直言,这对用户来说没有任何不便,至少它不适合我.我只是在不考虑这一点的情况下进行比较.但我倾向于杀死浪费我的电池的应用程序.

另请注意,并非所有人都使用12小时格式.要根据用户设置/国家/地区获取本地化时间格式,请使用DateFormat.getTimeInstance().这将返回一个DateFormat,但这与SimpleDateFormat类似,只是将时间传递给format().


Ald*_*asa 5

使用 Calendar.HOUR_OF_DAY 作为 24 小时时钟

Calendar rightNow = Calendar.getInstance();
mTv.setText("Refreshed! Last updated " + 
rightNow.get(Calendar.HOUR_OF_DAY) + ":" + 
rightNow.get(Calendar.MINUTE) + ".");
Run Code Online (Sandbox Code Playgroud)