Javascript 补偿自动电子邮件中的时区

Javascript 补偿自动电子邮件中的时区,javascript,date,email,datetime,time,Javascript,Date,Email,Datetime,Time,所以我有一个应用程序,它有两种类型的用户。当这些用户匹配时,我会在匹配后立即收到一封电子邮件,然后我希望在将来的日期和时间发送另一封电子邮件,并将其保存在我的数据库(MySQL)中。我的问题是设置自动电子邮件的时间(使用sendgrid作为传输)。我正在尝试建立一种方法,根据每个用户的时区(每个表单的数据库中输入的时区)计算每个用户的正确时间,以便它根据节省的时间在同一时刻发送。我想我没有正确理解这一点。有人能告诉我怎么做吗。这就是我目前所拥有的 Date.prototype.scheduleD

所以我有一个应用程序,它有两种类型的用户。当这些用户匹配时,我会在匹配后立即收到一封电子邮件,然后我希望在将来的日期和时间发送另一封电子邮件,并将其保存在我的数据库(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,则不必担心夏令时导致的时钟变化。客户端时差不应引起关注

如果你安排一个电子邮件,由服务器在Outo:0:01发送,纽约的收件人将看到它是在19:01(EST/UTC - 5小时)发送的,而旧金山的接收者将看到它是在16:01(PST/UTC - 8小时)发送的。正好是同一时间

设置Linux服务器时区

设置服务器时区取决于服务器操作系统,我假设服务器运行的是Linux。打开服务器上的控制台,
date
命令将为您提供本地时间和时区信息

$ date
Wed Nov  9 06:36:54 UTC 2016
$ sudo unlink /etc/localtime 
$ sudo ln -s /usr/share/zoneinfo/UTC /etc/localtime
如果系统未使用UTC,则很容易更改

Ubuntu:
sudo dpkg重新配置tzdata

RedHat:
sudo RedHat配置日期

在菜单中选择
“无上述内容”
“等”
,然后选择
“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信息

$ date
Wed Nov  9 06:36:54 UTC 2016
$ sudo unlink /etc/localtime 
$ sudo ln -s /usr/share/zoneinfo/UTC /etc/localtime
设置MySQL时区

标识系统时区,这是服务器启动时设置的时区:

SELECT @@system_time_zone;
获取当前会话的时间戳:

SELECT CURRENT_TIMESTAMP;
获取UTC时间戳:

SELECT UTC_TIMESTAMP();
获取当前会话与UTC之间的时差:

SELECT TIMEDIFF(CURRENT_TIMESTAMP, UTC_TIMESTAMP);
您可以使用UTC的偏移量设置当前会话的时区

SET TIME_ZONE = '+00:00';
如果要使更改永久化,必须查找并编辑MySQL配置文件
my.cnf
,并设置默认时区。它的位置将取决于MySQL在您的系统上的安装方式

default_time_zone='+00:00'

进行更改后重新启动服务器,并使用上述命令验证更改。

向我正在查看的服务器发送unix时间戳。
NOW()?我想,在两个用户确认后,基本上在将来的适当时间发送一封电子邮件给,这样我就需要告诉它何时到达这个日期,以及何时发送另一封电子邮件。这是一种解脱。。。。那么,如何确保我的服务器在处理时间时使用UTC?我有一个带有mysqlI的node,我有一个mac,我正在使用node.js。在保存/更新记录时,我似乎无法找到任何方法让mysql数据库使用utc时间。没关系,我以为您是在生产环境中。好消息是MySQL内部将日期存储为UTC,当您选择日期值时,它将转换为当前会话的时区。我将编辑我的答案以包含一些相关的MySQL命令。
UTC\u TTIMSTAMP()
正是我所需要的。感谢您的编辑和帮助!