MomentJS时区 - GMT + 2的本地输入时间

时间:2017-05-09 20:08:40

标签: javascript timezone momentjs

我正在尝试使用MomentJS Timezone将用户输入的时间从当地时间转换为GMT + 1,但是,之前我从未使用过此库,文档让我感到困惑。

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

> (define (fib n)
    (define/free (f index n-2 n-1)
      (displayln n)
      (if (< index 1)
          n-1
          (f (sub1 index) n-1 (+ n-2 n-1))))
    (f n 0 1))

n: identifier used out of context
context...:
matching binding...: in: n

然后我使用此函数来收集发送到PHP文件的日期和时间,如下所示:

    <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>

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

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

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)转换为New_York?

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

提前致谢。

2 个答案:

答案 0 :(得分:1)

要从本地时间转换为固定的UTC偏移量,您根本不需要时刻时区附加组件。你可以单独使用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(...)

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

答案 1 :(得分:0)

它将给定的日期时间2014-06-01 12:00从世界上的默认时区(GMT)更改为提供的日期时间moment.tz.setDefault("America/New_York"); 。 您也可以使用以下方式更改默认值:

{{1}}

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

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

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

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