所以我有一个具有两种类型用户的应用程序。每当这些用户匹配时,一旦匹配就会收到一封电子邮件,然后我希望在未来的日期和时间发送另一封电子邮件,并将其保存在我的数据库(MySQL)中。我的问题是设置自动电子邮件的时间(使用 sendgrid 作为传输)。我正在尝试制定一种方法来根据每个用户的时区(他们在每个表单中输入数据库中的时区)计算正确的时间,以便根据节省的时间在同一时刻发送。我想我没有正确理解这一点。有人可以向我解释如何完成这件事吗?这就是我到目前为止所拥有的。
Date.prototype.scheduleDate = function(day, time, tz)
{
var dat = new Date(this.valueOf());
do{
dat.setDate(dat.getDate() + 1);
}
while(dat.getDay() !== day);
if(time === 'Morn'){
switch(tz){
case 'eastern':
dat.setHours(10,30,0,0);
break
case 'central':
dat.setHours(9,30,0,0);
break
case 'mountain':
dat.setHours(8,30,0,0);
break
case 'pacific':
dat.setHours(7,30,0,0);
break
}
}else if(time === 'Noon'){
switch(tz){
case 'eastern':
dat.setHours(15,30,0,0);
break
case 'central':
dat.setHours(14,30,0,0);
break
case 'mountain':
dat.setHours(13,30,0,0);
break
case 'pacific':
dat.setHours(12,30,0,0);
break
}
}else if(time === 'Eve'){
switch(tz){
case 'eastern':
dat.setHours(19,30,0,0);
break
case 'central':
dat.setHours(18,30,0,0);
break
case 'mountain':
dat.setHours(17,30,0,0);
break
case 'pacific':
dat.setHours(16,30,0,0);
break
}
}else if(time === 'Night'){
switch(tz){
case 'eastern':
dat.setHours(22,0,0,0);
break
case 'central':
dat.setHours(21,0,0,0);
break
case 'mountain':
dat.setHours(20,0,0,0);
break
case 'pacific':
dat.setHours(19,0,0,0);
break
}
}
return dat;
}
最佳答案
如果您的服务器使用 UTC,则不必担心因夏令时而导致的时钟变化。客户端时间差异无需担心。
如果您安排服务器在 00:01 UTC 发送电子邮件,则纽约的收件人将看到该电子邮件是在 19:01(EST/UTC -5 小时)发送的,而旧金山的收件人将看到该电子邮件是在 19:01(EST/UTC -5 小时)发送的。它于 16:01(太平洋标准时间/世界标准时间 -8 小时)发送。时间完全一样。
设置Linux服务器时区
设置服务器时区取决于服务器操作系统,我假设服务器运行Linux。在服务器上打开控制台,date
命令将为您提供本地时间和时区信息。
$ date
Wed Nov 9 06:36:54 UTC 2016
如果系统不使用 UTC,则很容易更改。
Ubuntu:sudo dpkg-reconfigure tzdata
RedHat:sudo redhat-config-date
在菜单中选择“以上都不是”
或“Etc”
,然后选择“UTC”
。
或者,您可以通过复制/链接相应的时区信息文件来手动更改时区。
$ ls /usr/share/zoneinfo
Africa Cuba GMT0 Japan Pacific Turkey
America EET GMT-0 Kwajalein Poland UCT
Antarctica Egypt GMT+0 leap-seconds.list Portugal Universal
Arctic Eire Greenwich Libya posix US
Asia EST Hongkong localtime posixrules UTC
Atlantic EST5EDT HST MET PRC WET
Australia Etc Iceland Mexico PST8PDT W-SU
Brazil Europe Indian MST right zone.tab
Canada Factory Iran MST7MDT ROC Zulu
CET GB iso3166.tab Navajo ROK
Chile GB-Eire Israel NZ Singapore
CST6CDT GMT Jamaica NZ-CHAT SystemV
您想要更改 /etc/localtime
以使用 UTC 信息。
$ sudo unlink /etc/localtime
$ sudo ln -s /usr/share/zoneinfo/UTC /etc/localtime
设置MySQL时区
识别系统时区,这是服务器启动时设置的时区:
SELECT @@system_time_zone;
获取当前 session 的时间戳:
SELECT CURRENT_TIMESTAMP;
获取UTC时间戳:
SELECT UTC_TIMESTAMP();
获取当前 session 与UTC之间的时差:
SELECT TIMEDIFF(CURRENT_TIMESTAMP, UTC_TIMESTAMP);
您可以使用 UTC 偏移量设置当前 session 的时区。
SET TIME_ZONE = '+00:00';
如果您想让更改永久生效,您必须找到并编辑 MySQL 配置文件 my.cnf
并设置默认时区。它的位置取决于 MySQL 在您的系统上的安装方式。
default_time_zone='+00:00'
更改后重新启动服务器并使用上述命令验证更改。
关于javascript - 补偿自动电子邮件中的时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40497804/