如何制作一个基于英文时间的计时器
How to make a timer based on English time
我在游戏中使用每日奖励,“dd/MM/yyyy”格式的日期基于Locale.ENGLISH
final Date currentDate = Calendar.getInstance().getTime();
final SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy", Locale.ENGLISH);
为了让用户更清楚,我想倒计时到下一次奖励的剩余时间,我也想根据Locale.ENGLISH
倒计时
我希望格式为 24 小时,例如如果是 12 小时,倒计时将显示 12:00:00
我当前的代码:
long durationTime = 3600;
new CountDownTimer(durationTime, 1000) {
@Override
public void onTick(long millisUntilFinished) {
runOnUiThread(new Runnable() {
@Override
public void run() {
@SuppressLint("DefaultLocale") String time = String.format(Locale.ENGLISH, "%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(millisUntilFinished),
TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished)-
TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millisUntilFinished)),
TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished)-
TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished)));
final String[] hourMinSec = time.split(":");
timeHours.setText(hourMinSec[0]);
timeMinutes.setText((hourMinSec[1]));
timeSeconds.setText((hourMinSec[2]));
}
});
}
@Override
public void onFinish() {
}
}.start();
我需要替换long durationTime
的值
基本上你想计算现在和特定日期之间的秒数差异,以便相应地显示倒计时。
根据您的 post,我假设收到的奖励“解锁日期”是格式为 dd/MM/yyyy
.
的字符串
你已经有了你对应的SimpleDateFormat
,所以你可以用它把解锁日期解析成一个Date对象:
String unlockDateAsString = "26/05/2022";
Date unlockDate = dateFormat.parse(unlockDateAsString);
在这种情况下,时间部分初始化为 0,这正是您需要的。
您还可以获得当前时间:
Date now = new Date();
使用 Date.getTime() 您可以获取自纪元以来的毫秒数。通过从现在的毫秒数中减去未来的毫秒数,你得到的差值只需要转换为秒。
long differenceInMilliseconds = unlockDate.getTime() - now.getTime();
long differenceInSeconds = differenceInMilliseconds / 1000;
切勿使用 Date
和 SimpleDateFormat
。那些可怕的遗留 classes 多年前被 JSR 310 中定义的现代 java.time classes 所取代。
获取当前 date-time 需要时区。对于任何给定时刻,全球各地的日期因时区而异。指定 desired/expected 时区,或询问 JVM 当前的默认时区。
ZoneId z = ZoneId.of( "Africa/Casablanca" ) ;
ZonedDateTime now = ZonedDateTime.now( z ) ;
显然您想知道在该时区中到第二天第一刻的时间量。
不要假设这一天从 00:00 开始。某些区域中的某些日期在另一个时间开始,例如 01:00。让java.time确定一天的第一个时刻。
ZonedDateTime startOfTomorrow = now.toLocalDate().plusDays( 1 ).atStartOfDay( z ) ;
计算要经过的时间。
Duration d = Duration.between( now , startOfTomorrow ) ;
我建议您不要使用clock-time格式来报告持续时间。歧义使用户很容易将持续时间与一天中的某个时间混淆。我将从 Duration#to…Part
方法提供的部分构建一个字符串。
但如果您坚持,请使用此 hack 中的 LocalTime
class。
String output = LocalTime.MIN.plus( d ).toString() ; // I recommend *against* using this format, but if you insist…
你说:
I also want to base the countdown on Locale.ENGLISH
语言环境与跟踪时间无关。它们在此上下文中的唯一用途是在呈现给用户时对文本进行本地化。
语言环境和时区是两个独立的问题,它们是正交的,仅在呈现本地化时才相交。
我在游戏中使用每日奖励,“dd/MM/yyyy”格式的日期基于Locale.ENGLISH
final Date currentDate = Calendar.getInstance().getTime();
final SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy", Locale.ENGLISH);
为了让用户更清楚,我想倒计时到下一次奖励的剩余时间,我也想根据Locale.ENGLISH
我希望格式为 24 小时,例如如果是 12 小时,倒计时将显示 12:00:00
我当前的代码:
long durationTime = 3600;
new CountDownTimer(durationTime, 1000) {
@Override
public void onTick(long millisUntilFinished) {
runOnUiThread(new Runnable() {
@Override
public void run() {
@SuppressLint("DefaultLocale") String time = String.format(Locale.ENGLISH, "%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(millisUntilFinished),
TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished)-
TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millisUntilFinished)),
TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished)-
TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished)));
final String[] hourMinSec = time.split(":");
timeHours.setText(hourMinSec[0]);
timeMinutes.setText((hourMinSec[1]));
timeSeconds.setText((hourMinSec[2]));
}
});
}
@Override
public void onFinish() {
}
}.start();
我需要替换long durationTime
基本上你想计算现在和特定日期之间的秒数差异,以便相应地显示倒计时。
根据您的 post,我假设收到的奖励“解锁日期”是格式为 dd/MM/yyyy
.
你已经有了你对应的SimpleDateFormat
,所以你可以用它把解锁日期解析成一个Date对象:
String unlockDateAsString = "26/05/2022";
Date unlockDate = dateFormat.parse(unlockDateAsString);
在这种情况下,时间部分初始化为 0,这正是您需要的。
您还可以获得当前时间:
Date now = new Date();
使用 Date.getTime() 您可以获取自纪元以来的毫秒数。通过从现在的毫秒数中减去未来的毫秒数,你得到的差值只需要转换为秒。
long differenceInMilliseconds = unlockDate.getTime() - now.getTime();
long differenceInSeconds = differenceInMilliseconds / 1000;
切勿使用 Date
和 SimpleDateFormat
。那些可怕的遗留 classes 多年前被 JSR 310 中定义的现代 java.time classes 所取代。
获取当前 date-time 需要时区。对于任何给定时刻,全球各地的日期因时区而异。指定 desired/expected 时区,或询问 JVM 当前的默认时区。
ZoneId z = ZoneId.of( "Africa/Casablanca" ) ;
ZonedDateTime now = ZonedDateTime.now( z ) ;
显然您想知道在该时区中到第二天第一刻的时间量。
不要假设这一天从 00:00 开始。某些区域中的某些日期在另一个时间开始,例如 01:00。让java.time确定一天的第一个时刻。
ZonedDateTime startOfTomorrow = now.toLocalDate().plusDays( 1 ).atStartOfDay( z ) ;
计算要经过的时间。
Duration d = Duration.between( now , startOfTomorrow ) ;
我建议您不要使用clock-time格式来报告持续时间。歧义使用户很容易将持续时间与一天中的某个时间混淆。我将从 Duration#to…Part
方法提供的部分构建一个字符串。
但如果您坚持,请使用此 hack 中的 LocalTime
class。
String output = LocalTime.MIN.plus( d ).toString() ; // I recommend *against* using this format, but if you insist…
你说:
I also want to base the countdown on Locale.ENGLISH
语言环境与跟踪时间无关。它们在此上下文中的唯一用途是在呈现给用户时对文本进行本地化。
语言环境和时区是两个独立的问题,它们是正交的,仅在呈现本地化时才相交。