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

标签 javascript date email datetime time

所以我有一个具有两种类型用户的应用程序。每当这些用户匹配时,一旦匹配就会收到一封电子邮件,然后我希望在未来的日期和时间发送另一封电子邮件,并将其保存在我的数据库(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-c​​onfig-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/

相关文章:

javascript - 查找数组中要删除的特定对象

javascript - 在javascript中排序之前排除特定的数组对象

python - 生成间隔之间的日期时间列表

python - 如何在 python 中将 zip 文件作为附件发送?

javascript - 调用监听器内的函数时出现问题 (onClick)

javascript - 如何影响传递给函数的字符串对象

python - Pandas 使用另一列的值移动日期

javascript - JSON.parse 或替代库也将解析日期

PHP 邮件在 gmail 上引起网络钓鱼警告

c# - 如何在 c# .net web 应用程序中获取特定的资源字符串而不考虑当前的文化