2016-03-02 147 views
0

我有兩個日期字符串想要轉換爲Date對象。將日期字符串轉換爲日期對象

這裏是我的方法:

var d1 = "{{demand.event_mindate}}"; 
var d2 = "{{demand.event_maxdate}}"; 

var max_date = new Date(d1); 
var min_date = new Date(d2); 

這裏是通過我的alert()調用的輸出:

d1 -> 29 mars 2016 
d2 -> 29 avril 2016 

的問題是min_date到Date對象的作品是轉換,但對於max_date不起作用。轉換後,我得到一個無效的日期。

任何人都可以幫助我解決這個問題嗎?

+0

你是如何結合'demand.event_mindate'?輸入日期字符串是什麼樣的? –

+0

這是Django模板語言。當我打印ad1和d2時,我得到了d1打印,但是d2我得到了無效日期。 – user3232446

回答

1

如果您測試所有法語月份,除2月,5月,6月,7月,8月和12月之外的所有語句都會正確解析。這是因爲前三(3)個字符被正確解析了幾個月,這些月份的起始字母與其英文字母相同。只是偶然,名字是相似的。請參閱下表。


接近解析基於語言環境的日期字符串的這個問題最簡單的方法,是使用這樣的庫爲MomentJS

如果您需要使用其他語言解析日期,則可以包含所需的語言,也可以包含all languages

爲了簡潔起見,我帶你所謂的「輸出」,並用它作爲輸入。在您澄清您的輸入內容之前,以下內容應該足以解決問題。

moment.locale('fr'); // Load French 
 
var frenchMonths = ('janvier,février,mars,avril,mai,juin,' + 
 
        'juillet,août,septembre,octobre,novembre,décembre').split(','); 
 

 
generateRows(document.getElementById('date-table'), frenchMonths.map(function(month) { 
 
    return '29 ' + month + ' 2016'; // Format the month name into a valid date-string 
 
}), function(dateString) { 
 
    return [ 
 
     dateString, 
 
     new Date(dateString), 
 
     moment(dateString, 'DD MMMM YYYY').toDate() 
 
    ]; 
 
}); 
 

 
function generateRows(table, data, fn) { 
 
    return appendChildren(table, data.map(function() { 
 
    return createRow(fn.apply(null, arguments)) 
 
    })); 
 
} 
 
function createRow(data) { 
 
    return appendChildren(document.createElement('tr'), data.map(function(value) { 
 
    return createCell(value); 
 
    })); 
 
} 
 
function createCell(value) { 
 
    var td = document.createElement('td'); 
 
    td.innerHTML = new String(value).substring(0, 34); 
 
    if (value instanceof Date && !isValidDate(value)) td.className = 'invalid'; 
 
    return td; 
 
} 
 
function appendChildren(parent, nodes) { 
 
    for (var i = 0; i < nodes.length; i++) { parent.appendChild(nodes[i]); } 
 
    return parent; 
 
} 
 
function isValidDate(date) { 
 
    if (Object.prototype.toString.call(date) === '[object Date]') { 
 
    return !isNaN(date.getTime()); // d.valueOf() could also work 
 
    } else { 
 
    return false; 
 
    } 
 
}
body { 
 
    font-family: Consolas,Menlo,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New,monospace,sans-serif; 
 
    font-size: 0.8em; 
 
} 
 
table, tr, th, td { 
 
    border-collapse: collapse; 
 
    border: thin solid #000; 
 
} 
 
.invalid { 
 
    color: #F00; 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.11.2/moment.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.11.2/locale/fr.js"></script> 
 

 
<table id="date-table"> 
 
    <thead> 
 
    <tr> 
 
     <th>Input</th> 
 
     <th>Output - Date Casting</th> 
 
     <th>Output - MomentJS Parse</th> 
 
    </tr> 
 
    </thead> 
 
    <tbody></tbody> 
 
</table>

如果您需要了解有關MomentJS格式化,檢查出formatting guide


更新

我認爲,這是什麼​​在談論:

var months = 'janvier,février,mars,avril,mai,juin,juillet,août,septembre,octobre,novembre,décembre'.split(','); 
 
function parseDate(datestring, months, expression, matchFn) { 
 
    return matchFn.apply(null, expression.exec(datestring).map(function(value) { 
 
    return !isNaN(value) ? parseInt(value, 10) : value; 
 
    })); 
 
} 
 

 
var date = parseDate('29 avril 2016', months, /(\d{1,2}) (\w+) (\d{4})/, function(dateString, day, month, year) { 
 
    return new Date(year, months.indexOf(month), day); 
 
}); 
 

 
document.body.innerHTML = date.toString();

+0

thanx爲您的答案。但爲什麼d1工作和d2不是? d1 imonth是在法國! – user3232446

+0

@ user3232446:你可以給我***'***和***'d2'的實際輸入嗎?我假設他們是Python日期對象/字符串...我只能確定什麼可能是錯誤的。 –

+0

D1是:29 mars 2016和d2是:29艾薇兒2016.我無法理解爲什麼D1的作品和D2不是!是的,這是python – user3232446