簡體   English   中英

JavaScript中的日期操作

[英]date manipulation in javascript

我有此字符串,例如"November 8, 2016 - December 7, 2016" ,我想以以下格式提取兩個日期: YYYY-MM-DD 現在,我設法通過以下方式以所需的格式獲取日期:

HTML:

<span id="selecDate">November 8, 2016 - December 7, 2016</span>

使用Javascript:

date = $('#selecDate').text().split('-');
begin = new Date(date[1]);
begin = begin.toISOString().split('T')[0];

問題在於date = ["November 8, 2016 ", " December 7, 2016"]

begin = "Wed Dec 07 2016 00:00:00 GMT+0200 (IST)"

在第二行但在最后一行時,begin的值將提前一天更改為"2016-12-06" 知道如何避免嗎?

我正在(GMT + 02:00)時區工作

當執行toISOString() ,您返回的日期是以UTC時間表示的,因此要花費2個小時的時間(因為當前時區)。 IST的12月6日午夜是前一天的UTC時間22:00。

如果希望將時間戳記為本地時間,則可以在日期對象上使用.toLocaleDateString()toLocaleString()或什至只是.toString()

begin = new Date('December 7, 2016').toLocaleDateString();

請注意,日期格式略有不同:

a.toLocaleDateString() "12/7/2016" 12/7/2016 "12/7/2016"

a.toLocaleString() "12/7/2016, 12:00:00 AM" 2016,12: "12/7/2016, 12:00:00 AM"

a.toString() "Wed Dec 07 2016 00:00:00 GMT+0200 (IST)"

就像MDN所說的toISOString()方法:

時區始終為零UTC偏移。

當您創建new Date('December 7, 2016') ,您將獲得:

2016年12月7日星期三00:00:00 GMT + 0200

因此,在UTC中,小時數將減去2,從而得到前一天的信息。

解決方案

begin = begin.getFullYear() + '-' + (begin.getMonth() + 1) + '-' + begin.getDate();

結果為:“ 2016-12-07”。

date = ["November 8, 2016 ", " December 7, 2016"];
var b = new Date(date[1]);

//use these get methods to avoid all the confusion
var begin = b.getFullYear()+"-"+(b.getMonth()+1)+"-"+b.getDate();
console.log(_begin);

您不應該使用Date構造函數來解析字符串,尤其是當它們的格式不同於ECMA-262中指定的格式時,因為行為取決於實現。

如果需要Date對象,則應該使用一個庫(例如moment.jsfecha.js )並提供解析格式,或者編寫一個簡單函數將格式解析為日期(請參見下文)。

但是,如果您只想使用其他格式的字符串,則只需重新格式化該字符串並完全避免使用Dates:

 // Reformat a date string in format MMMM d, yyyy to yyyy-mm-dd function reformatDate(s) { var b = s.match(/\\w+/g) || []; var months = {jan:'01',feb:'02',mar:'03',apr:'04',may:'05',jun:'06', jul:'07',aug:'08',sep:'09',oct:'10',nov:'11',dec:'12'}; return b.length == 3? b[2] + '-' + months[b[0].toLowerCase().substr(0,3)] + '-' + ('0' + b[1]).slice(-2) : ''; } console.log(reformatDate('November 8, 2016')) 

以下函數將MMMM d,yyyy格式的日期解析為Date對象,然后將其格式化為yyyy-mm-dd格式:

 // Parse date string in format MMMM d, yyyy eg November 8, 2016 function parseDate(s) { var months = 'jan feb mar apr may jun jul aug sep oct nov dec'.split(' '); var b = s.match(/\\w+/g) || []; var m = months.indexOf(b[0].toLowerCase().substr(0,3)); var d = new Date(b[2], m, b[1]); return d && d.getMonth() == m? d : new Date(NaN); } function toISODate(d) { function z(n){return (n<10?'0':'')+n} return d.getFullYear() + '-' + z(d.getMonth()+1) + '-' + z(d.getDate()); } console.log(toISODate(parseDate('November 8, 2016'))) 

使用像moment.js這樣的庫,您可以執行以下操作:

 'November 8, 2016 - December 7, 2016'.split(' - ').forEach(function(s) { var d = moment(s,'MMMM D, YYYY').format('YYYY-MM-DD'); console.log(d); }); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.js"></script> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM