Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.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
C# 确定某个时区的时间是否在某个范围内_C#_Datetime_Timezone_Datetimeoffset - Fatal编程技术网

C# 确定某个时区的时间是否在某个范围内

C# 确定某个时区的时间是否在某个范围内,c#,datetime,timezone,datetimeoffset,C#,Datetime,Timezone,Datetimeoffset,我的公司有支持人员,可以在CST时间早上7点到晚上7点使用,我们会在我们的网站上显示一个启动聊天的按钮,或者显示一条消息说他们不可用。支持人员位于中央时区,但我们的站点所在的服务器可能位于任何时区。(我远程工作,当我在本地机器上运行项目时,例如在东部时间) 现在有一个bug,上面说你在CST下午6点超出了时间范围,这太早了一个小时。这似乎是因为我在CST中的时间范围实际上跨越UTC时间的2天(从下午1点到次日凌晨1点),并且我的时间不在UTC日期。我知道这是造成问题的原因,但我不确定解决问题的最

我的公司有支持人员,可以在CST时间早上7点到晚上7点使用,我们会在我们的网站上显示一个启动聊天的按钮,或者显示一条消息说他们不可用。支持人员位于中央时区,但我们的站点所在的服务器可能位于任何时区。(我远程工作,当我在本地机器上运行项目时,例如在东部时间)

现在有一个bug,上面说你在CST下午6点超出了时间范围,这太早了一个小时。这似乎是因为我在CST中的时间范围实际上跨越UTC时间的2天(从下午1点到次日凌晨1点),并且我的时间不在UTC日期。我知道这是造成问题的原因,但我不确定解决问题的最佳方法

下面是代码,从返回布尔值的函数转换为控制台应用程序,以注销eh值

查看以下代码,或在此处使用:

//=================================================================================================
//获取运行时间和天数
//这些文件通常来自一个配置文件,但在这里对它们进行硬编码以供演示
int availableChatStartHour=13//UTC时间上午7点CST
int availableChatDuration=12//CST上午7点起12小时为下午7点
string[]availableDaysForChat=“星期一、星期二、星期三、星期四、星期五”。ToUpper().Split(',');
//=================================================================================================
//当前时区不可知时间。
var now=DateTime.UtcNow;
//将时间转换为日期对象
//-------------------------------------------------
//我想这就是我的错误所在
var startTime=new DateTime(now.Year,now.Month,now.Day,availablechattstarthour,0,0,DateTimeKind.Utc);
//-------------------------------------------------
var endTime=startTime.AddHours(availableChatDuration);
//公司总部位于中央时区
//中央时区可以使用夏令时。
//我们需要确定DST当前是否在CST中处于活动状态
var cstZone=TimeZoneInfo.FindSystemTimeZoneById(“中央标准时间”);
var cstTime=TimeZoneInfo.ConvertTimeFromUtc(现在是cstZone);
var isdstative=cstZone.IsDaylightSavingTime(cstTime);
//如果DST是活动的,那么我们需要从开始和结束时间中减去一小时。
if(isstactive)
{
startTime=startTime.AddHours(-1);
endTime=endTime.AddHours(-1);
}
//确定一周中的某一天(CST时间)是否可以聊天
var isDayAvilable=availableDaysForChat.Contains(cstTime.DayOfWeek.ToString().ToUpper());
//确保一天中的时间在可接受的范围内
var isAfterStartTime=now>startTime;
var isBeforeEndTime=现在<结束时间;
//现在把一切都考虑进去,看看聊天室是否可用
//返回IsDayaVillable&&isAfterStartTime&&isBeforeEndTime;
Console.WriteLine(“NOW:+NOW”);
Console.WriteLine(“开始:+startTime”);
Console.WriteLine(“结束:+endTime”);
Console.WriteLine(“---------------------------------------”;
Console.WriteLine(“可用日期:+isDayAvilable”);
Console.WriteLine(“在开始时间之后:+isAfterStartTime”);
Console.WriteLine(“在结束时间之前:+isBeforeEndTime”);
Console.WriteLine(“---------------------------------------”;
WriteLine(“最终结果:+(isDayAvilable&&isAfterStartTime&&isBeforeEndTime));
关于如何使这项工作正常工作,你有什么想法吗?

你所做的远远超出了你的需要。就个人而言,我会使用我的项目,但所有这些都可以通过BCL轻松完成,使用:

var zone=TimeZoneInfo.FindSystemTimeZoneById(“中央标准时间”);
var centralTime=TimeZoneInfo.ConvertTime(DateTime.UtcNow,zone);
如果(centralTime.Hour>=7&¢ralTime.Hour<21&&
centralTime.DayOfWeek>=DayOfWeek.Monday&&

centralTime.DayOfWeek你真的是说他们在中央时间早上6点到下午6点有空吗?@JonSkeet我的意思是在中央标准时区从早上7点到晚上7点。(该公司位于佛罗里达州狭长地带)没有所谓的“中央标准时区”.有中央时区,它在冬天遵守中央标准时间,在夏天遵守中央昼间时间。我99.9%确定这就是你的意思…@JonSkeet好的,那么是的。对不起。我想错了,因为它在
FindSystemTimeZoneById(“中央标准时间”)中被称为“中央标准时间”)
-我刚刚添加了“区域”一词最后。是的,Windows时区ID的名称真的很不幸。最好使用IANA维护的更标准的时区ID,但您不需要在这里。太好了,非常感谢。这比我以前使用的更简单、更容易理解。@ChrisBarr:我会避免使用字符串表示法-您可以轻松创建一个
列表
。日期在web.config文件中设置,以便在需要时可以快速更新。然后,我再次怀疑这是否真的需要更新。星期一到星期五是很标准的。好主意。@ChrisBarr:将其放在配置文件中似乎是合理的-但我会将其解析为
列表
(即字符串到枚举)在启动时,而不是稍后从枚举转换为字符串。这样,您可以在启动时发现拼写错误,而不是神秘地发现您在“Monady”上没有收到任何调用:
//=================================================================================================
//Get hours & days of operation
//These normally come from a config file, but hardcoding them here for demo
int availableChatStartHour = 13; //7am CST in UTC time
int availableChatDuration = 12;  //12 hours from 7am CST is 7pm CST
string[] availableDaysForChat = "monday,tuesday,wednesday,thursday,friday".ToUpper().Split(',');
//=================================================================================================

//The current timezone-agnostic time.
var now = DateTime.UtcNow;

//Convert times to a date object
//-------------------------------------------------
//I THINK THIS IS WHERE MY BUG IS
var startTime = new DateTime(now.Year, now.Month, now.Day, availableChatStartHour, 0, 0, DateTimeKind.Utc);
//-------------------------------------------------
var endTime = startTime.AddHours(availableChatDuration);

//Company HQ is located in the central time zone
//The central time zone can experience daylight saving time.
//We need to determine if DST is currently active or not in CST
var cstZone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
var cstTime = TimeZoneInfo.ConvertTimeFromUtc(now, cstZone);
var isDstActive = cstZone.IsDaylightSavingTime(cstTime);

//If DST is active, then we need to subtract an hour from the start and end times.
if (isDstActive)
{
    startTime = startTime.AddHours(-1);
    endTime = endTime.AddHours(-1);
}

//Determine if the day of the week (in CST time) is available for chat
var isDayAvilable = availableDaysForChat.Contains(cstTime.DayOfWeek.ToString().ToUpper());

//Make sure the time of day is within the acceptable range
var isAfterStartTime = now > startTime;
var isBeforeEndTime = now < endTime;

//Now take everything into account and see if the chat is available
//return isDayAvilable && isAfterStartTime && isBeforeEndTime;


Console.WriteLine("NOW:   "+ now);
Console.WriteLine("START: "+ startTime);
Console.WriteLine("END:   "+ endTime);
Console.WriteLine("-------------------------------------");
Console.WriteLine("Day Available:       "+isDayAvilable);
Console.WriteLine("Is After Start Time: "+ isAfterStartTime);
Console.WriteLine("Is Before End Time:  "+ isBeforeEndTime);
Console.WriteLine("-------------------------------------");
Console.WriteLine("FINAL RESULT:        "+ (isDayAvilable && isAfterStartTime && isBeforeEndTime));
var zone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
var centralTime = TimeZoneInfo.ConvertTime(DateTime.UtcNow, zone);
if (centralTime.Hour >= 7 && centralTime.Hour < 21 &&
    centralTime.DayOfWeek >= DayOfWeek.Monday &&
    centralTime.DayOfWeek <= DayOfWeek.Friday)
{
    // Yes, you have support staff
}
else
{
    // Nope, let the answerphone handle it
}