Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何比较;现在";未来_Java_Android_Calendar - Fatal编程技术网

Java 如何比较;现在";未来

Java 如何比较;现在";未来,java,android,calendar,Java,Android,Calendar,我需要将本地文件的下载时间与将来/过去的时间进行比较,以查看是否需要重新下载该文件以更新它。我可以通过以下方式获取上次下载本地文件的时间: long-timeSinceCreateFile=myFile.lastModified() 我需要检查timesinecreatefile,时间是下周五21:30,如果当前时间是:System.currentTimeMillis() 是以后再重新下载这个文件 我已经阅读了大量关于日历、时间、日期、Joda Time等的信息,但还没有弄清楚如何将某个时刻作为

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

long-timeSinceCreateFile=myFile.lastModified()

我需要检查
timesinecreatefile
,时间是下周五21:30,如果当前时间是:
System.currentTimeMillis()
是以后再重新下载这个文件

我已经阅读了大量关于日历、时间、日期、Joda Time等的信息,但还没有弄清楚如何将某个时刻作为特定的日期、小时、小步舞曲等,这是相对于
timescinecreatefile

编辑

我需要知道下载(或上次修改)文件的时间间隔(毫秒)
long-timeSinceCreateFile=myFile.lastModified()
和下一个星期五21:30(与
timeSinceCreateFile
之后的星期五21:30相同)

然后,我可以将“下周五21:30”毫秒与当前时间“System.currentTimeMillis()`进行比较,如果其中一个大于另一个,则重新下载该文件

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


谢谢。

格雷戈里安卡伦达?将日期设置为年、月、日、21:30,将星期几设置为星期五。使用getTime获得长毫秒。这将给你一个UNIX时间,大约在星期五21:30接近你的约会。继续添加或删除一周内的毫秒数,直到减去文件时间的时间在[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));


}
publicstaticvoidmain(字符串[]args){
long fileCreateTime=new Date().getTime();
格里高利安日历=新的格里高利安日历();
calendar.setTime(新日期(fileCreateTime));
calendar.set(calendar.DAY\u OF_WEEK,calendar.FRIDAY);
calendar.set(calendar.HOUR\u OF_DAY,21);
日历。设置(日历。分钟,30);
calendar.set(calendar.SECOND,0);
calendar.set(calendar.毫秒,0);
每周长毫秒=7*24*60*60*1000;
长日历毫秒=calendar.getTime().getTime();
while(日历毫秒FileCreateTime+每周毫秒){
日历毫秒-=每周毫秒;
}
System.out.println(新日期(日历毫秒));
}
难看,但会起作用。

避免使用java.util.Date和.Calendar 避免使用java.util.Date和.Calendar,因为它们是出了名的麻烦、有缺陷和混乱。使用Java8中的新java.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 );

使用
Java.util.Calendar
Java.util.Date
在标准Java库中很难实现“下周五21:30”的临时条件

Joda时间中它还需要一个非平凡的解决方法(同样是循环)

Java-8(Java.time包中的新时间库JSR-310)中,可以使用中的专门方法提供一个可接受的解决方案,但由于您在Android上操作,因此这不是一个可行的方法


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

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);

使用数学?例如,将时间添加到
timeSinceCreateFile
?我想我没有抓住要点
System.currentTimeMillis()
永远不会出现在下周五的未来!所以请澄清你的问题。这两个日期都用一个长整数表示,所以你只需要确定哪个日期大于另一个,除非我不理解你的问题。好的,我也会重新处理这个问题,你为什么要数mil。秒?为什么不只是比较日期和修改?只是好奇,为什么新的java.time软件包不是Android的发展方向???@Ash Android与java-6-API密切相关,但并不完全遵循java-6-API,因此新的JSR-310-API在Android平台上根本不可用。请也看看这个(谷歌拒绝了)。作为解决方法,您可以尝试使用。但我认为Time4J现在在许多领域已经做得更好了,而且肯定有更多的创新能力。上面的代码示例在下一个版本1.2中甚至会进一步简化(没有if子句)?time4j型芯或time4j型芯始终是需要的。如果您想通过枚举引用标准时区标识符或想解析本地化的时区名称,olson是可选的,也是必需的。感谢Meno Hochschild heaps找到我的问题!我花了一段时间来破解你的密码(由于工作、睡眠、阅读等原因),但它工作得非常完美!你能告诉我使用“墙”这个词来描述时间上的具体相对位置背后的想法/概念吗(我想),我理解代码,但我想知道它的含义。再次感谢!!