确定何时基于DateTime下载文件

时间:2015-03-26 09:07:20

标签: c#

有一个文件需要下载,该文件已准备好每天晚上8点下载,因为它会被第三方更新。只有在用户点击某个页面时才会下载该文件。此文件是显示最新信息所需的外部资源。下载文件时,时间与文件一起存储。所以我们知道,

  1. 需要下载文件时
  2. 上次下载文件的时间
  3. 我们知道现在的时间。我如何根据上面的知识确定何时下载文件。
  4. 这是我尝试的测试,但这不起作用:

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

3 个答案:

答案 0 :(得分:2)

我会采取以下方法:

  • 确定最近的发布时间
  • 检查当前文件是否已下载

我会使用Noda Time执行此操作,使用Instant作为第一步的结果以及我在“上次下载时间”方面记住的值但您可以执行此操作还有DateTime ...我建议将所有内容保留在UTC中,并使用TimeZoneInfo进行转换。 (我将时区设置为可配置,并且不假设系统时区。这可以保持灵活性......)

要计算出最近的出版时间,我会:

  • 取当前时间(UTC)
  • 计算出目标时区的本地日期和时间
    • 如果时间晚于晚上8点,则计算出在给定时区内计算日期的晚上8点对应的UTC时间。
    • 否则,计算计算日期之前当天晚上8点的UTC时间

所以像(未经测试):

// 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");
}

这既简短又容易阅读。