C# 根据日期时间确定何时下载文件

C# 根据日期时间确定何时下载文件,c#,C#,有一个文件需要下载,该文件可以在每天晚上8点下载,因为它会被第三方更新。只有当用户点击某个页面时,才会下载该文件。此文件是显示最新信息所需的外部资源。下载文件时,时间与文件一起存储。所以我们知道, 当需要下载文件时 最后一个文件是什么时候下载的 我们知道现在是什么时间。我如何确定何时下载该文件,而不是基于我们上面所知道的 这是我尝试过的测试,但不起作用: DateTime currentFileDownloadedTime = new DateTime(DateTime.Now.Year, Da

有一个文件需要下载,该文件可以在每天晚上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");
            }
    
    DateTime currentFileDownloadedTime=新的日期时间(DateTime.Now.Year,DateTime.Now.Month,DateTime.Now.Day,10,00,0);
    DateTime currentTime=新的日期时间(DateTime.Now.Year,DateTime.Now.Month,DateTime.Now.Day,10,01,15);
    DateTime downloadTime=newdatetime(DateTime.Now.Year,DateTime.Now.Month,DateTime.Now.Day,20,0,0);
    如果(currentFileDownloadedTime.Date.Day currentFileDownloadedTime.TimeOfDay.Total毫秒)&&
    (currentTime.TimeOfDay.TotalMillistics>downloadTime.TimeOfDay.TotalMillistics))
    {
    Console.WriteLine(“下载文件”);
    }
    
    基本上,您必须检查客户端访问的时间是否在当天上午8点之后。如果您有来自不同时区的客户端,则必须进行标准化(转换为UTC)

    DateTime nowUtc=TimeZoneInfo.ConvertTimeToUtc(DateTime.Now);
    DateTime fileRefreshUtc=DateTime.Now.Today+new Timespan(6,0,0);
    if(nowUtc>fileRefreshUtc&&lastDownloaded
    有关如何检查当前时间是否在特定范围内的详细信息,请参见检查


    编辑:刚刚意识到我忘了检查文件是否已经下载。我已经编辑了代码。我们的想法是为今天的文件刷新创建一个日期(
    fileRefreshUtc
    )。然后,您可以检查当前日期是否在刷新之后,如果跟踪上次下载时间,则可以检查客户端是否已下载新文件版本。

    基本上,您必须检查客户端访问的时间是否在当天上午8点之后。如果您有来自不同时区的客户端,则必须进行标准化(转换为UTC)

    DateTime nowUtc=TimeZoneInfo.ConvertTimeToUtc(DateTime.Now);
    DateTime fileRefreshUtc=DateTime.Now.Today+new Timespan(6,0,0);
    if(nowUtc>fileRefreshUtc&&lastDownloaded
    有关如何检查当前时间是否在特定范围内的详细信息,请参见检查


    编辑:刚刚意识到我忘了检查文件是否已经下载。我已经编辑了代码。我们的想法是为今天的文件刷新创建一个日期(
    fileRefreshUtc
    )。然后,您可以检查当前日期是否在刷新之后,如果您跟踪上次下载时间,您可以检查客户端是否已经下载了新的文件版本。

    我将采取以下方法:

    • 确定最近的发布时间
    • 检查在此之后是否下载了当前文件
    我会使用我的,作为第一步的结果,使用
    Instant
    和我记忆中的“上次下载时间”值,但你也可以使用
    DateTime
    来完成这项工作。。。我建议将所有内容保持在UTC,并使用
    TimeZoneInfo
    进行转换。(我会将时区设置为可配置的,并且不会对系统时区进行任何假设。这会使事情保持灵活性…)

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

    • 取当前时间(UTC)
    • 计算出目标时区的本地日期和时间
      • 如果时间晚于晚上8点,则计算出给定时区内计算日期晚上8点对应的UTC时间
      • 否则,计算出计算日期前一天晚上8点对应的UTC时间
    比如(未经测试):


    我将采取以下方法:

    • 确定最近的发布时间
    • 检查在此之后是否下载了当前文件
    我会使用我的,作为第一步的结果,使用
    Instant
    和我记忆中的“上次下载时间”值,但你也可以使用
    DateTime
    来完成这项工作。。。我建议将所有内容保持在UTC,并使用
    TimeZoneInfo
    进行转换。(我会将时区设置为可配置的,并且不会对系统时区进行任何假设。这会使事情保持灵活性…)

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

    • 取当前时间(UTC)
    • 计算出目标时区的本地日期和时间
      • 如果时间晚于晚上8点,则计算出给定时区内计算日期晚上8点对应的UTC时间
      • 否则,计算出计算日期前一天晚上8点对应的UTC时间
    比如(未经测试):


    不要用诡计来比较日期,比如比较日期、毫秒或其他。只要比较DateTime对象,它就会像一个符咒一样工作!另外,尽量只使用UTC时间,这将使您的工作更轻松

    我想当然地认为您的输入是
    currentFileDownloadedTime
    ,即您下载文件的时间和
    uploadTime
    ,即今天应该上载远程文件的时间

    如果您尚未
    uploadTime>currentFileDownloadedTime
    ,并且如果您现在晚于上载时间,则必须重新下载:
    DateTime.UtcNow>uploadTime

    这就给了

    if((uploadTime > currentFileDownloadedTime) && (DateTime.UtcNow > uploadTime))
    {
        Console.WriteLine("Downloading File");
    }
    

    它既简短又容易阅读。

    不要用诡计来比较日期,
    // 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);
    
    if((uploadTime > currentFileDownloadedTime) && (DateTime.UtcNow > uploadTime))
    {
        Console.WriteLine("Downloading File");
    }