【问题标题】:MomentJS Timezone - Local input time to GMT+2MomentJS 时区 - GMT+2 的本地输入时间
【发布时间】:2017-05-09 20:08:40
【问题描述】:

我正在尝试使用 MomentJS 时区将用户输入的时间从本地时间转换为 GMT+1,但是,我以前从未使用过这个库,文档让我很困惑。

我的表单使用 Bootstrap Datepicker 和 Bootstrap timepicker 创建用于输入事件日期和时间的 UI,如下所示:

    <label>Date:</label>
    <input type="text" id="dteDay">
    <input type="hidden" id="iptDate">
    <label>Time (GMT+1 only):</label>
    <input id="iptTime" type="text">

   <script>
    $("#dteDay").datepicker({
        format: "dd/mm/yyyy",
        todayBtn: "linked",
        todayHighlight: true,
        startDate: "-2d",
        endDate: "+0d",
    });


    $('#iptTime').timepicker({
        minuteStep: 5,
        showMeridian: false
    });
    </script>

然后我使用这个函数来收集日期和时间发送到一个 PHP 文件,像这样:

function CreateReport(){        
        if( $("#sltMyName").select2("val") == null ){
            ShowError("Please Enter Your Name!");
        }
        else if( $("#sltTheirName").select2("val") == null ){
            ShowError("Please Enter Their Name!");
        }
        else if( $("#dteDay").val() == "" ){
            ShowError("Please Enter the Date of Incident!");
        }
        else if( $("#iptTime").val() == "" ){
            ShowError("Please Enter the Time of Incident!");
        }
        else if( $("#txtStory").val() == "" ){
            ShowError("Please Enter the Full Story!");
        }
        else if( $("#txtEvidence").val() == "" ){
            ShowError("Please List your Evidence");
        }
        else{
            if( $("#sltOffence").val() == "Other" && $("#iptOtherOffence").val() == ""){
                ShowError("Please Enter Offence");
            }
            else if( $("#sltOffence").val() == "Other" ){
                var Offence = $("#iptOtherOffence").val();
            }
            else{
                var Offence = $("#sltOffence").val();
            }
            $.post(
                'includes/complaint/index.php',
                {
                    Server: $("#sltServerRegion").val(),
                    MyName: JSON.stringify($("#sltMyName").select2("val")),
                    TheirName: JSON.stringify($("#sltTheirName").select2("val")),
                    Date: $("#dteDay").val(),
                    Time: $("#iptTime").val(),
                    Offence: Offence,
                    Story: $("#txtStory").val(),
                    Evidence: $("#txtEvidence").val(),
                    RefundAmount: $("#iptRefundAmount").val(),
                    RefundPreference: $("#sltRefundPreference").val()
                },
                function(data){
                    returnValue = JSON.parse(data);
                    if( returnValue["data"] == 1){
                        window.location.href = returnValue["url"];
                    }
                    else{
                        ShowError(returnValue["msg"]);
                    }
                }
            );
        }
    }

我需要做的是将输入的时间更改为 GMT+1(或者最好是夏天的 GMT+2),以匹配我们其他系统使用的时间。

我了解 MomentJS 时区可以将日期转换为特定时区,如下所示:

var newYork = moment.tz("2014-06-01 12:00", "America/New_York");
newYork.format();    // 2014-06-01T12:00:00-04:00

虽然我不太了解。它将它从什么(即 GMT+1)转换为 New_York?

简而言之,我如何将用户输入的时间从本地时间转换为 GMT+1(或夏季 GMT+2,如果可能),然后将它们拆分以传递给 AJAX 函数?

提前致谢。

【问题讨论】:

  • 如果可能,“或在夏季 GMT+2”是什么意思?
  • 当我们从 GMT+1 更改为 GMT+2 时,时钟前进一小时。
  • 此更改是隐式的。当时钟前进一小时时,它们会在整个世界中前进。因此,如果您检索带有时区的当前日期并将其转换为另一个时区,他们已经将这个更改带回来
  • 我猜。老实说,时区“科学”让我感到困惑。
  • @quirimmo - 不,他们绝对不会在全世界前进。世界很复杂,世界各地的时区差异很大。许多国家/地区不使用夏令时,而使用夏令时的国家则略有不同。

标签: javascript timezone momentjs


【解决方案1】:

要将本地时间转换为固定的 UTC 偏移量,您根本不需要 moment-timezone 插件。您可以单独使用 Moment.js 执行此操作。例如:

var m = moment("2017-01-01 00:00:00");    // input is local time
m.utcOffset('+01:00');                    // convert to UTC+1
var s = m.format("YYYY-MM-DD HH:mm:ss");  // output string

但是,由于您要求将本地时间转换为在 UTC+1 和 UTC+2 之间切换以实现夏令时的时区,因此您确实必须使用时刻时区。但首先,您必须为您的目的地选择正确的时区 - 并非每个在 +1 和 +2 之间切换的时区都在同一天或一天​​中的同一时间进行。不要随便挑一个。可以在here找到它们的列表。

一个这样的时区是Europe/Paris,它使用欧盟的 DST 规则从 UTC+1 (CET) 切换到 UTC+2 (CEST)

var m = moment("2017-01-01 00:00:00");    // input is local time
m.tz('Europe/Paris');                     // convert to UTC+1
var s = m.format("YYYY-MM-DD HH:mm:ss");  // output string

此外,在您的问题中,您询问了该示例的转换来源。它根本没有转换——它把输入当作America/New_York时间。由于您想从本地时间开始,因此您不会使用 moment.tz(...) 来构建时刻,而是在现有的本地时刻上使用 .tz(...)

还有一件事 - 另一个答案建议更改默认时区。那实际上并不能解决您的问题。事实上,它会阻止您实现您所描述的 - 因为您的所有输入都将被视为该时区内的时间,而不是用户计算机的本地时区。

【讨论】:

    【解决方案2】:

    它将给定的日期时间 2014-06-01 12:00 从世界 (GMT) 中的默认时区更改为提供的时区。 您还可以使用以下方法更改默认值:

    moment.tz.setDefault("America/New_York");
    

    这是您可以在时刻时区中用作字符串的默认时区列表:

    https://en.wikipedia.org/wiki/List_of_tz_database_time_zones

    您也可以使用 moment 和 utcOffset 方法:

    http://momentjs.com/docs/#/manipulating/utc-offset/

    【讨论】:

    • moment.tz.setDefault("Africa/Brazzaville"); 应该成功
    • 抱歉,我可能不太了解您想要做什么。实际上您想将所有日期转换为 GMT+2?
    • 我认为您正在为世界时区的概念而苦苦挣扎 :) 如果我在我的系统(意大利)上的 JavaScript 中获取当前日期,则系统已经知道自己是 GMT。这是输出:Tue May 09 2017 22:01:59 GMT+0100 (GMT Daylight Time) 使用.getTimezoneOffset() 方法,实际 tz 与默认值之间存在差异。在我的情况下:-60 你可以打开你的控制台并自己尝试。因此,考虑到您正在使用时刻,如果您使用上面的代码 (moment.tz.setDefault()),则默认情况下您拥有给定时区的所有时刻日期(在您的情况下为 GMT +2)
    • 没有您发布的代码将您的日期“2014-06-01 12:00”视为默认 GMT 转换为 GMT+2 非洲/布拉柴维尔。此行告诉 moment 将 GMT+2 moment.tz.setDefault("Africa/Brazzville"); 用作默认日期。所以如果你改变它,然后用时刻获取当前日期,你会看到它是在 GMT+2
    • 当然,我对您之前问题的回答并不准确。更新它并为您准备一个 jsfiddle 来解释它是如何工作的:jsfiddle.net/vn46wbcs
    猜你喜欢
    • 1970-01-01
    • 2012-12-01
    • 2014-10-25
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 2013-10-29
    • 2012-11-29
    相关资源
    最近更新 更多