C# 如何计算给定时间的不同时区(夏令时之后)
我有一个在线图书销售网站,管理和实体书店位于印度,但服务器托管在USA服务器上。 管理员要求创建一份成功订单的报告,并每天上午11:00和下午4:00向他发送两次邮件 上午11:00时,他应获得下午4:00(前一天)至上午11:00(当天)之间的订单列表 在下午4:00,他应在上午11:00(当天)和下午4:00(当天)之间获得订单列表 为了实现它,我创建了一个表,其中保存了该映射的记录,就像在n时间调用页面一样,那么报告应该在x和z时间之间生成 在页面加载中,我获取当前时间和从时间到时间。 使用的代码如下所示C# 如何计算给定时间的不同时区(夏令时之后),c#,asp.net,datetime,dst,C#,Asp.net,Datetime,Dst,我有一个在线图书销售网站,管理和实体书店位于印度,但服务器托管在USA服务器上。 管理员要求创建一份成功订单的报告,并每天上午11:00和下午4:00向他发送两次邮件 上午11:00时,他应获得下午4:00(前一天)至上午11:00(当天)之间的订单列表 在下午4:00,他应在上午11:00(当天)和下午4:00(当天)之间获得订单列表 为了实现它,我创建了一个表,其中保存了该映射的记录,就像在n时间调用页面一样,那么报告应该在x和z时间之间生成 在页面加载中,我获取当前时间和从时间到时间。 使
DateTime dt = DateTime.Now;//getting server time
DateTime gmttime = DateTime.Now.ToUniversalTime();//getting gmt time
DateTime indiantime = gmttime.AddHours(5).AddMinutes(30);//get india time(is always constant dont follows daylight saving)
TimeSpan diff = dt-indiantime; // calculating the difference
string runH = indiantime.ToString("%h"); // geting the hour component of india time
string runTT = indiantime.ToString("tt"); //getting ap/pm component of india time
string indiantimeformat = "dd/MM/yyyy h:m tt";
CultureInfo c = System.Globalization.CultureInfo.InvariantCulture;
string q = "SELECT frmH,frmTT,infrmprevious,toH,toTT,intoprevious FROM successfullordermailtiming WHERE runH = '"+runH+"' AND runTT = '"+runTT+"'"; //quering the database for getting from and when
DataTable ddt = dtu.Table(q);
if (ddt.Rows.Count>0)
{
object[] ob = ddt.Rows[0].ItemArray;
string frmH= ob[0].ToString();
string frmTT=ob[1].ToString();
string infrmprevious=ob[2].ToString();
string toH =ob[3].ToString();
string toTT =ob[4].ToString();
string intoprevious = ob[5].ToString();
DateTime indianfrom = indiantime;
if (infrmprevious == "1")
{
indianfrom = indiantime.AddDays(-1); // if previous the substract 1 day
}
DateTime indianto = indiantime;
if (intoprevious == "1")
{
indianto = indianto.AddDays(-1);
}
//make indian frm
string indianfrm = indianfrom.ToString("dd/MM/yyyy") + " " + frmH + ":0 " + frmTT; //making from india time
string indiantoo = indianto.ToString("dd/MM/yyyy") + " " + toH + ":0 " + toTT; //making to india time
indianfrom = DateTime.ParseExact(indianfrm, indiantimeformat, System.Globalization.CultureInfo.InvariantCulture);
indianto = DateTime.ParseExact(indiantoo, indiantimeformat, System.Globalization.CultureInfo.InvariantCulture);
DateTime serverfrm = indianfrom + diff; //calculating frm servertime
DateTime serverto = indianto + diff; //calculating to server time
该代码一直正常工作,直到4月12日左右服务器为夏令时(丹佛(MDT))在那里进行了调整
请告诉我我做错了什么?我假设,由于GMT时间总是常数,我计算GMT时间,然后计算印度时间,然后从服务器时间减去印度时间(差值)。我从数据库中生成印度时间frm和to组件,然后再次添加计算差以获得等效的服务器时间。。我的逻辑错了吗。我读过关于日光节约的书,但由于我的国家没有遵循它,我发现很难真正理解它的含义(它说一天可以是23小时或25小时)。请更正。您可以参考以下代码:
var varLondon = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");//Returns Timezone based on particular ID, ID can be related to pasific timezone, Indian TimeZone,etc.
var varGoogleplex = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");
var now = DateTimeOffset.UtcNow; //Gives you local clock time for your currrent time zone
TimeSpan TSLondonOffset = varLondon.GetUtcOffset(now); //will return you timespan of current time zone and specified one.
TimeSpan TSGoogleplexOffset = varGoogleplex.GetUtcOffset(now);
希望对您有所帮助。您可以参考以下代码:
var varLondon = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");//Returns Timezone based on particular ID, ID can be related to pasific timezone, Indian TimeZone,etc.
var varGoogleplex = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");
var now = DateTimeOffset.UtcNow; //Gives you local clock time for your currrent time zone
TimeSpan TSLondonOffset = varLondon.GetUtcOffset(now); //will return you timespan of current time zone and specified one.
TimeSpan TSGoogleplexOffset = varGoogleplex.GetUtcOffset(now);
希望对您有所帮助。您能通过注释详细说明您的代码吗?我真的觉得日期时间很难理解。您能通过注释详细说明您的代码吗?我真的觉得日期时间很难理解。请参阅相关问题所提到的时间(上午11点和下午4点)在哪个时区,您如何在数据库中存储值?上午11点和下午4点是印度时间(+5:30)日期时间值仅存储在服务器时间。请参阅相关问题提到的时间(上午11点和下午4点)在哪个时区,您如何在数据库中存储值?上午11点和下午4点是印度时间(+5:30)日期时间值仅存储在服务器时间中。