我正在尝试在我的应用程序上次更新时显示在TextView中(例如,"上次更新时间为12:13)。我正在尝试使用Calendar实例,我认为我理解正确,但我似乎遇到了麻烦。我知道要获取一个实例,我使用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。谢谢你的帮助。
另外,如果我能说'#34;最后更新5分钟前,那将是理想的。"而不是"最后更新时间为下午12:13"。但我不确定每分钟更新一次这种更新的最佳方法,而不会耗尽资源或电池......?
答案 0 :(得分:8)
我建议将SimpleDateFormat与Date类结合使用以格式化时间:
Date now = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("K:mm a");
String formattedTime = sdf.format(now);
简短说明如何运作: 您创建一个SimpleDateFormat对象并将一个String传递给它的construtor,它告诉它如何格式化每个传递给它的format()函数的时间/日期对象。 有很多常量/字母代表一个特殊的时间对象(例如,秒,AM / PM标记,..请参阅class documentation获取完整列表)。
“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()。
答案 1 :(得分:3)
使用Calendar.HOUR_OF_DAY 24小时
Calendar rightNow = Calendar.getInstance();
mTv.setText("Refreshed! Last updated " +
rightNow.get(Calendar.HOUR_OF_DAY) + ":" +
rightNow.get(Calendar.MINUTE) + ".");
答案 2 :(得分: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();
答案 3 :(得分: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))
);