如何从当前时间获得下周日的剩余时间?

时间:2017-07-20 15:54:30

标签: android calendar date-difference

我尝试了很多不同的方法来找出确切的解决方案,但我只有时间差,如果我知道未来的日期,但我想从下一个星期日的时间开始。

2 个答案:

答案 0 :(得分:2)

你可以试试这个,

    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());

    int saturdayInMonth = calendar.get(Calendar.DAY_OF_MONTH) + (Calendar.SATURDAY - calendar.get(Calendar.DAY_OF_WEEK));

    calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),
            saturdayInMonth, 23, 59, 59); // This time will be sunday night 23 hour 59 min and 59 seconds

    Date sunday = new Date(calendar.getTimeInMillis() + 1000); //this is 1 second after that seconds that is sunday 00:00.

答案 1 :(得分:2)

Android 中,您可以使用ThreeTen Backport,这是Java 8新日期/时间类的绝佳后端,以及ThreeTenABP(更多关于如何使用它{ {3}})。所有类都在org.threeten.bp包中。

要获得2个日期之间的差异,可以使用org.threeten.bp.ZonedDateTime,因为此类负责夏令时更改(以及可能发生的任何其他偏移更改),并提供正确/准确的结果(如果如果不使用时区进行计算,计算中不会考虑DST更改。

我还使用org.threeten.bp.temporal.TemporalAdjusters类,它有一个内置方法来查找下一个指定的星期几(通过使用org.threeten.bp.DayOfWeek类中的常量)。

为了获得差异,您可以使用org.threeten.bp.temporal.ChronoUnit.MILLIS来获得以毫秒为单位的差异(然后使用此值以您想要的任何格式显示)。或者您可以使用org.threeten.bp.temporal.ChronoUnit课程中提供的其他常量(例如MINUTESHOURS,这会在几分钟或几小时内显示差异 - here以查看所有可用单位)

获得差异的另一种方法是使用org.threeten.bp.Duration,其中包含两个日期之间的秒数和纳秒数。

// change this to the timezone you need
ZoneId zone = ZoneId.of("Asia/Kolkata");
// get current date in the specified timezone
ZonedDateTime now = ZonedDateTime.now(zone);
// find next Sunday
ZonedDateTime nextSunday = now.with(TemporalAdjusters.next(DayOfWeek.SUNDAY));

// get the difference in milliseconds
long diffMillis = ChronoUnit.MILLIS.between(now, nextSunday);

// get the difference as a Duration
Duration duration = Duration.between(now, nextSunday);

请注意,我使用了时区Asia/Kolkata。 API使用check the javadoc(始终采用Region/City格式,如America/Sao_PauloEurope/Berlin)。 避免使用3个字母的缩写(例如ISTPST),因为它们是IANA timezones names

您可以致电ZoneId.getAvailableZoneIds()获取可用时区列表(并选择最适合您系统的时区)。

上面的代码将nextSundaynow的时间(小时/分钟/秒/纳秒)相同 - 除非有DST更改(在这种情况下,ambiguous and not standard

但是如果你想从现在开始到下一个星期日的开始的剩余时间,那么你必须在计算差异之前将其调整到一天的开始:

// adjust it to the start of the day
nextSunday = nextSunday.toLocalDate().atStartOfDay(zone);

请注意,一天的开始并不总是午夜 - 由于DST更改,一天可以从凌晨01:00开始(时钟可能设置为午夜前进1小时,成为当天的第一个小时凌晨1点。使用atStartOfDay(zone)可以保证您不必担心,因为API会为您处理。

如果当前日期已经是星期日,您想要的结果是什么?

即使当前日期是星期日,上面的代码也会到达下一个星期日。如果您不想这样,可以使用TemporalAdjusters.nextOrSame,如果它已经是星期日,则会返回相同的日期。

要以时间单位(如小时,分钟和秒)显示Duration值,您可以执行以下操作:

StringBuilder sb = new StringBuilder();
long seconds = duration.getSeconds();
long hours = seconds / 3600;
append(sb, hours, "hour");
seconds -= (hours * 3600);
long minutes = seconds / 60;
append(sb, minutes, "minute");
seconds -= (minutes * 60);
append(sb, seconds, "second");
append(sb, duration.getNano(), "nanosecond");

System.out.println(sb.toString());

// auxiliary method
public void append(StringBuilder sb, long value, String text) {
    if (value > 0) {
        if (sb.length() > 0) {
            sb.append(" ");
        }
        sb.append(value).append(" ");
        sb.append(text);
        if (value > 1) {
            sb.append("s"); // append "s" for plural
        }
    }
}

结果(在我当前的时间)是:

  

47小时44分43秒148000000纳秒

如果您想要毫秒而不是纳秒,则可以将append(sb, duration.getNano(), "nanosecond")替换为:

// get milliseconds from getNano() value
append(sb, duration.getNano() / 1000000, "millisecond");