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