我需要将本地文件的下载时间与未来/过去的时间进行比较,以查看是否需要重新下载该文件以进行更新。我可以得到上次下载本地文件的时间:
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()`如果一个大于另一个重新下载文件。
希望这澄清了我的问题,如果不让我知道,因为我真的需要帮助。
感谢。
答案 0 :(得分:3)
你的时间条件"下周五21:30"使用java.util.Calendar
和java.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和.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 );