[英]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.js , fecha.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.