2016-10-03 29 views
0

在我的Node.js應用程序中,用戶提交日期,時間和時區(單獨的表單字段)。使用Moment Timezone,我試圖保存調整爲無偏移的日期(與時區無關)。Moment JS - 將用戶提交的日期/時間/時區轉換爲與時區無關的UTC

下面的代碼工作,但有一個更簡單/更清潔的方式來實現相同的結果?有乘以抵消-1似乎hackish的:

const userDate = new Date(req.body.date + ' ' + req.body.time); 
const userTz = req.body.tz; 

const offset = moment.tz(userTz).utcOffset(); 
const utc = moment(userDate).utcOffset(-1*offset).format('YYYY-MM-DD[T]HH:mm:ss'); 

例輸入:

Date: 09/06/2016 (via Bootstrap date picker) 
Time: 07:41:00 (via Bootstrap time picker) 
Timezone: America/New_York (UTC/GMT -4 hours) 

返回(正確):

2016-09-06T11:41:00Z 

提前感謝!

+0

moment.js,你可以使用UTC變種。例如。 moment.utc() - > http://momentjs.com/docs/#/parsing/utc/ – Keith

+0

如何使用沒有原始時區知識的.utc()正確調整偏移量? –

+0

未經測試。你可以鏈接像時刻(userDate).tz(userTz).utc()。格式('YYYY-MM-DD HH:mm:ss') – Veeram

回答

3

您可以使用tz在用戶輸入的時區中創建一個日期,但在javascript日期對象中沒有直接的方式。一旦你的日期重建moment.tz繼續前進,並將其轉換爲utc,現在格式它,但是你想要

此外,請在運行時間不同的瀏覽器中檢查您的解決方案(中顯示的問題),我確信它會給出不同的結果。

let req = {}; 
 
req.body = {date: "09/06/2016", 
 
      time: "07:41:00", 
 
      tz: "America/New_York"}; 
 

 
const a = moment 
 
      .tz(req.body.date+ " " + req.body.time,"MM/DD/YYYY HH:mm:ss" ,req.body.tz) 
 
      .utc() 
 
      .format(); 
 

 
console.log(a);
<script src="http://momentjs.com/downloads/moment.min.js"></script> 
 
<script src="http://momentjs.com/downloads/moment-timezone-with-data-2010-2020.min.js"></script>

+1

謝謝!我沒有說明的一件小事是我的req.body.date格式爲MM/DD/YYYY格式,而不是DD/MM/YYYY格式,因此日期格式字符串需要相應更新。 –

+1

對於輸出,你不會在'T'和'Z'中使用'MM/DD/YYYY'。這些意味着ISO8601,它只允許'YYYY-MM-DD' –

+0

@MattJohnson喲! – sabithpocker

相關問題