如何比较“现在”和未来的时间

时间:2014-08-23 11:52:01

标签: java android calendar

我需要将本地文件的下载时间与未来/过去的时间进行比较,以查看是否需要重新下载该文件以进行更新。我可以得到上次下载本地文件的时间:

long timeSinceCreateFile = myFile.lastModified();

我需要的是检查timeSinceCreateFile的时间是星期五的21:30h,以及当前时间:System.currentTimeMillis() 将来会重新下载该文件。

我已经阅读了关于日历,时间,日期,Joda-Time等的大量内容,但未能弄清楚如何获得特定日,小时,小步舞等等的时刻。与timeSinceCreateFile

相对

修改

我需要知道文件下载(或上次修改)long timeSinceCreateFile = myFile.lastModified();与星期五下午21:30h之间的时间(以星期五晚上21:30h timeSinceCreateFile之间的时间) )

然后我可以比较"以下星期五21:30"毫秒到当前时间' System.currentTimeMillis()`如果一个大于另一个重新下载文件。

希望这澄清了我的问题,如果不让我知道,因为我真的需要帮助。

感谢。

3 个答案:

答案 0 :(得分:3)

你的时间条件"下周五21:30"使用java.util.Calendarjava.util.Date在标准Java库中很难实现

Joda-Time 中,它还需要一个非平凡的解决方法(再次使用循环)。

Java-8(java.time包中的新时间库JSR-310)中,可以使用TemporalAdjusters中使用专门方法的可接受解决方案,但由于您在Android上运行,不是要走的路。


相反,这里是我的库Time4J中的替代解决方案,它不需要任何容易出错的循环或复杂的条件:

import static net.time4j.PlainDate.DAY_OF_WEEK;
import static net.time4j.Weekday.FRIDAY;

File myFile = new File("");
long timeSinceCreateFile = myFile.lastModified();

// conversion to global timestamp in Time4J-format
Moment fileTSP = TemporalTypes.MILLIS_SINCE_UNIX.transform(timeSinceCreateFile);

// what ever you need (or just TZID timezone = Timezone.ofSystem().getID();)
TZID timezone = AMERICA.MONTREAL;

// "next friday" is a local time condition => convert to local timestamp
PlainTimestamp localTSP = fileTSP.toZonalTimestamp(timezone);
PlainTime walltime2130 = PlainTime.of(21, 30);

// move to next time 21:30 (possibly on next day) and then to next or same Friday
localTSP =
    localTSP.with(PlainTime.COMPONENT.setToNext(walltime2130))
            .with(DAY_OF_WEEK.setToNextOrSame(FRIDAY));

// convert current time to local timestamp and compare at 21:30
boolean downloadNeeded = SystemClock.inZonalView(timezone).now().isAfter(localTSP);

答案 1 :(得分:1)

GregorianCalendar?将日期设置为您的年,月,日,21:30,将星期几设置为星期五。使用getTime获得很长的毫秒数。这将为您提供接近您日期的某个星期五21:30的UNIX时间。继续添加或删除一周内的毫秒数,直到减去文件时间的时间在[0周内的毫秒数]范围内。警告月份,它基于0。

public static void main(String[] args){
    long fileCreateTime = new Date().getTime();

    GregorianCalendar calendar = new GregorianCalendar();
    calendar.setTime(new Date(fileCreateTime));
    calendar.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY);
    calendar.set(Calendar.HOUR_OF_DAY, 21);
    calendar.set(Calendar.MINUTE, 30);
    calendar.set(Calendar.SECOND, 0);
    calendar.set(Calendar.MILLISECOND, 0);

    long MILLISECS_IN_A_WEEK = 7*24*60*60*1000;

    long calendarMillisecs = calendar.getTime().getTime();
    while(calendarMillisecs<fileCreateTime){
        calendarMillisecs += MILLISECS_IN_A_WEEK;
    }
    while(calendarMillisecs>fileCreateTime+MILLISECS_IN_A_WEEK){
        calendarMillisecs -= MILLISECS_IN_A_WEEK;
    }

    System.out.println(new Date(calendarMillisecs));


}

丑陋,但会奏效。

答案 2 :(得分:0)

避免使用java.util.Date&amp; .Calendar

避免使用java.util.Date和.Calendar,因为它们非常麻烦,有缺陷且令人困惑。在Java 8中使用Joda-Time或新的java.time包。

约达时间

在Joda-Time 2.4。

DateTimeZone timeZone = DateTimeZone.forID( "America/Montreal" );
DateTime start = DateTime.now(  timeZone );
// DateTime start = new DateTime( fileLastModifiedMillis, timeZone );
DateTime dateTime = start; 
while ( dateTime.getDayOfWeek() != DateTimeConstants.FRIDAY ) {
    dateTime = dateTime.plusDays( 1 );
}

比较...

boolean isLate = oneDateTime.isAfter( someOtherDateTime );