有一个文件需要下载,该文件已准备好每天晚上8点下载,因为它会被第三方更新。只有在用户点击某个页面时才会下载该文件。此文件是显示最新信息所需的外部资源。下载文件时,时间与文件一起存储。所以我们知道,
这是我尝试的测试,但这不起作用:
DateTime currentFileDownloadedTime = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 10, 00, 0);
DateTime currentTime = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 10, 01, 15);
DateTime downloadTime = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 20, 0, 0);
if (currentFileDownloadedTime.Date.Day <= currentTime.Day &&
(currentTime.TimeOfDay.TotalMilliseconds > currentFileDownloadedTime.TimeOfDay.TotalMilliseconds) &&
(currentTime.TimeOfDay.TotalMilliseconds > downloadTime.TimeOfDay.TotalMilliseconds))
{
Console.WriteLine("Downloading File");
}
答案 0 :(得分:2)
我会采取以下方法:
我会使用Noda Time执行此操作,使用Instant
作为第一步的结果以及我在“上次下载时间”方面记住的值但您可以执行此操作还有DateTime
...我建议将所有内容保留在UTC中,并使用TimeZoneInfo
进行转换。 (我将时区设置为可配置,并且不假设系统时区。这可以保持灵活性......)
要计算出最近的出版时间,我会:
所以像(未经测试):
// TODO: Extract an IClock interface that has a SystemClock
// implementation and a FakeClock implementation - then you
// can write lots of unit tests for this.
DateTime utcNow = DateTime.UtcNow;
TimeZoneInfo zone = ...; // South Africa (parameter?)
TimeSpan publishTimeOfDay = ...; // 8pm (parameter?)
DateTime localNow = TimeZoneInfo.ConvertTime(utcNow, zone);
DateTime publishDate = localNow.TimeOfDay >= postTimeOfDay
? localNow.Date : localNow.Date.AddDays(-1);
DateTime localPublishDateTime = publishDate + publishTimeOfDay;
return TimeZoneInfo.ConvertTimeToUtc(localPublishDateTime, zone);
答案 1 :(得分:1)
基本上,您必须检查客户端访问的时间是否在当天上午8点之后。如果您有来自不同时区的客户端,则必须进行规范化(转换为UTC)。
DateTime nowUtc = TimeZoneInfo.ConvertTimeToUtc(DateTime.Now);
DateTime fileRefreshUtc = DateTime.Now.Today + new Timespan(6,0,0);
if(nowUtc > fileRefreshUtc && lastDownloaded < fileRefreshUtc)
{
//download file
lastDownloaded = DateTime.Now;
}
有关如何检查当前时间是否在特定范围内的更多信息,请检查this。
编辑:刚才意识到我忘了检查文件是否已下载。我编辑了代码。我们的想法是构建今天文件刷新的日期(fileRefreshUtc
)。然后,您可以检查当前日期是否在刷新之后,如果您跟踪上次下载时间,则可以检查客户端是否已下载新文件版本。
答案 2 :(得分:1)
不要使用恶作剧来比较日期,比如比较日期,毫秒或其他什么。只需比较DateTime对象,它就会像魅力一样!同时尝试仅使用UTC时间,它将使您的工作更轻松。
我理所当然地认为您的输入是currentFileDownloadedTime
,下载文件的时间和uploadTime
,即今天应该上传远程文件的时间。
如果您还没有uploadTime > currentFileDownloadedTime
,并且现在比上传时间更早,则必须进行新的下载:DateTime.UtcNow > uploadTime
。
这样就给了
if((uploadTime > currentFileDownloadedTime) && (DateTime.UtcNow > uploadTime))
{
Console.WriteLine("Downloading File");
}
这既简短又容易阅读。