2016-07-14 69 views
2

我有一个输入字段,用户需要选择日期/时间 根据一年中的时间,本地机器将始终处于GMT或BST状态。moment.js转换没有效果

对于那些谁不知道英国时间的恶作剧:

GMT(格林威治标准时间)始终为UTC

BST(英国夏令时)为GMT + 1在夏季

用户输入的日期将存储在设置为GMT的数据库中,因此永远不会偏移时间。因此我需要将用户输入的内容转换为GMT/UTC。

但是,我的转换导致返回相同的日期。

我在做什么错?

https://jsfiddle.net/r68owagL/

下面是从的jsfiddle

function log(obj) { 
    var html = "<table>" 
    for(var member in obj) 
    { 
     html += "<tr>" 
       + "<td>" + member + ": </td>" 
       + "<td>" + obj[member].format("YYYY-MM-DD HH:mm:ss") + "</td>" 
       + "</tr>"; 
    } 
    html += "</table>"; 
    document.body.innerHTML = html; 
} 

var strDate = '2016-07-14 10:51:00'; 
var obj = { 
    n: moment(strDate),     //Gives: 2016-07-14 10:51:00 
    u: moment.utc(strDate),    //Gives: 2016-07-14 10:51:00 
    b: moment.tz(strDate, "Europe/London") //Gives: 2016-07-14 10:51:00 
} 

log(obj); 

回答

2

代码如果您删除格式的字符串,然后输出日期,像这样

obj[member].format() 

那么像这样

输出
n: 2016-07-14T10:51:00+02:00 
u: 2016-07-14T10:51:00+00:00 
b: 2016-07-14T10:51:00+01:00 

因此,自定义格式字符串只输出日期而不考虑偏移量。要考虑到这些,将它打印出来,像这样

obj[member].utc().format("YYYY-MM-DD HH:mm:ss") 

导致

n: 2016-07-14 08:51:00 
u: 2016-07-14 10:51:00 
b: 2016-07-14 09:51:00 
+0

关闭足以让我正确的我的代码之前转换为UTC:https://jsfiddle.net/ r68owagL/1 /,因此将其标记为答案。基本上设置日期然后.utc()它。而不是.utc()然后设置日期 - 现在有意义我想 - 我这样做是这样说的,这是一个UTC日期,而不是这是一个本地日期。 – Morvael

+0

进一步更新,似乎是从dd/mm/yyyy HH:mm:ss的英国格式中读取中的用户选定值,结果是moment.js在转换后再次给出相同的值。 https://jsfiddle.net/r68owagL/2/为了解决,我必须在将它传递给moment()之前手动将格式设置为yyyy-MM-dd HH:mm:ss。 – Morvael

+0

@Morvael,你会得到一个贬低警告,那个时刻建设回落到JS日期。您需要为日期指定格式。那么你将不必手动解析。请参阅http://momentjs.com/guides/#/warnings/js-date/和http://momentjs.com/guides/#/parsing/known-formats/ –