如何制作一个基于英文时间的计时器

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;

切勿使用 DateSimpleDateFormat。那些可怕的遗留 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

语言环境与跟踪时间无关。它们在此上下文中的唯一用途是在呈现给用户时对文本进行本地化。

语言环境和时区是两个独立的问题,它们是正交的,仅在呈现本地化时才相交。