我正在尝试使用 MomentJS 时区将用户输入的时间从本地时间转换为 GMT+1,但是,我以前从未使用过这个库,文档让我感到困惑。
我的窗体使用 Bootstrap 日期选取器和 Bootstrap 时间选取器创建一个 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 函数?
提前谢谢。
要从本地时间转换为固定的 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 之间切换的时区都在同一天或一天中的同一时间进行。 不要随便选择一个。 可以在此处找到它们的列表。
一个这样的时区是Europe/Paris
,它使用欧盟的夏令时规则从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(...)
。
还有一件事 - 另一个答案建议更改默认时区。 这实际上不会解决您的问题。 事实上,它会阻止你实现你所描述的 - 因为这样你的所有输入都将被视为该时区内的时间,而不是用户计算机的本地时区。
它将给定的日期时间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/