6

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

这是我正在使用的代码:

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

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

此外,如果我可以说“上次更新 5 分钟前”,那将是理想的选择。而不是“最后更新时间为下午 12:13”。但是我不确定在不耗尽资源或电池的情况下每分钟进行此更新的最佳方式......?

4

4 回答 4

8

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

Date now = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("K:mm a");
String formattedTime = sdf.format(now);

简短解释它是如何工作的:您创建一个 SimpleDateFormat 对象并将一个字符串传递给它的构造函数,它告诉它如何格式化每个传递给它的 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()。

于 2011-08-08T07:32:03.077 回答
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) + ".");
于 2016-03-02T18:36:40.500 回答
1

您可以editText使用如下线程在每分钟更新一次

Thread t = new Thread(){
public void run() {     
    Calendar oldTime = Calendar.getInstance();
    oldMinute =  oldTime .get(Calendar.MINUTE);
    while(true) {
            Calendar rightNow= Calendar.getInstance();          
        newMinute = rightNow.get(Calendar.MINUTE);
        if(newMinute != oldMinute) {

            oldMinute = newMinute;

            mTv.setText("Refreshed! Last updated " + 
                       rightNow.get(Calendar.HOUR) + ":" + 
                       rightNow.get(Calendar.MINUTE) + ".");
        }
    }
}
t.start();
于 2011-08-08T07:08:23.847 回答
0

好吧,Calendar.get(Calendar.HOUR) 应该返回 12 小时的时间,但是如果您想生成稍微好一点的文本,您可以使用 TimeUnit 类来简化解析。

long millis = Calendar.getInstance().getTimeInMillis();
String.format("Last updated %d min, %d sec ago.", 
    TimeUnit.MILLISECONDS.toMinutes(millis),
    TimeUnit.MILLISECONDS.toSeconds(millis) - 
    TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis))
);
于 2011-08-08T01:21:22.573 回答