JavaScriptで文字列を日付に変換するにはどうすればよいですか?
var st = "date in some format"
var dt = new date();
var dt_st= //st in date format same as dt
Date -> String
かString -> Date
?
JavaScriptで文字列を日付に変換するにはどうすればよいですか?
var st = "date in some format"
var dt = new date();
var dt_st= //st in date format same as dt
Date -> String
かString -> Date
?
回答:
文字列解析に最適な文字列形式は、JavaScriptの日付オブジェクトコンストラクターと日付ISO形式です。
ISO形式の例:YYYY-MM-DD
またはYYYY-MM-DDTHH:MM:SS
。
ちょっと待って! 「ISOフォーマット」を使用するだけでは、それだけでは確実に機能しません。文字列は、UTCとして解析されることもあれば、ローカル時刻として解析されることもあります(ブラウザーのベンダーとバージョンに基づく)。ベストプラクティスは、常に日付をUTCとして保存し、計算をUTCとして行うことです。
日付をUTCとして解析するには、Zを追加します(例:)new Date('2011-04-11T10:20:30Z')
。
UTCで日付を表示するには.toUTCString()
、
を使用し、ユーザーのローカル時間で日付を表示するには、を使用します.toString()
。
古いInternet Explorerの互換性(IEバージョン9未満は日付コンストラクターでISO形式をサポートしていません)の場合、日付文字列表現をその部分に分割する必要があります。次に、日付部分を使用してコンストラクターを使用できますnew Date('2011', '04' - 1, '11', '11', '51', '00')
。例: 月の数は1少ない必要があることに注意してください。
別の方法-適切なライブラリを使用します。
指定されたタイムゾーンで日付を解析できるようにするライブラリMoment.jsを利用することもできます。
new Date('2011-04-11T11:51:00')
た場合、作成された日付は有効です。
new Date('1970-30-02')
は無効です。1年に30か月がないため、無効な日付です。月をオーバーフローすることはできませんが、日をオーバーフローすると、ChromeとFirefoxで有効な日付に解決されます。new Date('1970-02-30')
新しい日付( '1970-03-02')と同じ日になります。
残念ながら私はそれを知りました
var mydate = new Date('2014-04-03');
console.log(mydate.toDateString());
「Wed Apr 02 2014」を返します。奇妙に聞こえるかもしれませんが、一部のユーザーに起こります。
防弾ソリューションは、次のとおりであります:
var parts ='2014-04-03'.split('-');
// Please pay attention to the month (parts[1]); JavaScript counts months from 0:
// January - 0, February - 1, etc.
var mydate = new Date(parts[0], parts[1] - 1, parts[2]);
console.log(mydate.toDateString());
yyyy-MM-dd
UTCとして解析され、toStringはローカル時間を返すため、ユーザーのタイムゾーンに応じて、異なる結果を確実に返すことができます。常にUTCとして時刻が必要な場合は、toUTCStringを使用する必要があります。
var st = "26.04.2013";
var pattern = /(\d{2})\.(\d{2})\.(\d{4})/;
var dt = new Date(st.replace(pattern,'$3-$2-$1'));
そして出力は次のようになります:
dt => Date {Fri Apr 26 2013}
function stringToDate(_date,_format,_delimiter)
{
var formatLowerCase=_format.toLowerCase();
var formatItems=formatLowerCase.split(_delimiter);
var dateItems=_date.split(_delimiter);
var monthIndex=formatItems.indexOf("mm");
var dayIndex=formatItems.indexOf("dd");
var yearIndex=formatItems.indexOf("yyyy");
var month=parseInt(dateItems[monthIndex]);
month-=1;
var formatedDate = new Date(dateItems[yearIndex],month,dateItems[dayIndex]);
return formatedDate;
}
stringToDate("17/9/2014","dd/MM/yyyy","/");
stringToDate("9/17/2014","mm/dd/yyyy","/")
stringToDate("9-17-2014","mm-dd-yyyy","-")
.indexOf()
メソッドは、ポリフィルなしではブラウザ間の互換性がないため、信頼しないでください。代わりに、互換性の高い、.match()
または.test()
バニラのJSメソッドを使用してください。
var _delimiter = _format.match(/\W/g)[0];
関数の先頭に追加すると、自動的に区切り文字を取得して、3番目のパラメーターの前置文字列を取得できます。
moment.js(http://momentjs.com/)は、使用日の完全かつ優れたパッケージであり、ISO 8601文字列をサポートしています。
文字列の日付と形式を追加できます。
moment("12-25-1995", "MM-DD-YYYY");
そして、日付が有効かどうかを確認できます。
moment("not a real date").isValid(); //Returns false
いくつかの表示例
let dt = moment("02-01-2019", "MM-DD-YYYY");
console.log(dt.fromNow()+' |'+dt.format('LL'))
// output: "3 months ago | February 1, 2019"
ドキュメント http://momentjs.com/docs/#/parsing/string-format/を参照してください
推奨事項:タイムゾーンとフォーマットの時間管理は本当に大きな問題であり、瞬間のjsが多くのフォーマットを解決するため、多くのフォーマットを含む日付のパッケージを使用することをお勧めします。単純な文字列から日付まで簡単に日付を解析できますが、日付のすべての形式とバリエーションをサポートするのは難しい作業だと思います。
素晴らしいモーメントライブラリを使用できる場合(Node.jsプロジェクトなど)、例を使用して日付を簡単に解析できます。
var momentDate = moment("2014-09-15 09:00:00");
を介してJS日付オブジェクトにアクセスできます
momentDate ().toDate();
小さくてスマートなソリューションを探している人のために:
String.prototype.toDate = function(format)
{
var normalized = this.replace(/[^a-zA-Z0-9]/g, '-');
var normalizedFormat= format.toLowerCase().replace(/[^a-zA-Z0-9]/g, '-');
var formatItems = normalizedFormat.split('-');
var dateItems = normalized.split('-');
var monthIndex = formatItems.indexOf("mm");
var dayIndex = formatItems.indexOf("dd");
var yearIndex = formatItems.indexOf("yyyy");
var hourIndex = formatItems.indexOf("hh");
var minutesIndex = formatItems.indexOf("ii");
var secondsIndex = formatItems.indexOf("ss");
var today = new Date();
var year = yearIndex>-1 ? dateItems[yearIndex] : today.getFullYear();
var month = monthIndex>-1 ? dateItems[monthIndex]-1 : today.getMonth()-1;
var day = dayIndex>-1 ? dateItems[dayIndex] : today.getDate();
var hour = hourIndex>-1 ? dateItems[hourIndex] : today.getHours();
var minute = minutesIndex>-1 ? dateItems[minutesIndex] : today.getMinutes();
var second = secondsIndex>-1 ? dateItems[secondsIndex] : today.getSeconds();
return new Date(year,month,day,hour,minute,second);
};
例:
"22/03/2016 14:03:01".toDate("dd/mm/yyyy hh:ii:ss");
"2016-03-29 18:30:00".toDate("yyyy-mm-dd hh:ii:ss");
var ts = '1471793029764';
ts = Number(ts); // cast it to a Number
var date = new Date(ts); // works
var invalidDate = new Date('1471793029764'); // does not work. Invalid Date
undefined
値はありますか?のように:var date = new Date(undefined)
?
フォーマットpt-BRに変換:
var dateString = "13/10/2014";
var dataSplit = dateString.split('/');
var dateConverted;
if (dataSplit[2].split(" ").length > 1) {
var hora = dataSplit[2].split(" ")[1].split(':');
dataSplit[2] = dataSplit[2].split(" ")[0];
dateConverted = new Date(dataSplit[2], dataSplit[1]-1, dataSplit[0], hora[0], hora[1]);
} else {
dateConverted = new Date(dataSplit[2], dataSplit[1] - 1, dataSplit[0]);
}
誰かを助けたいと思います!!!
私はこのためのフィドルを作成しました。任意の日付文字列に対してtoDate()関数を使用し、日付形式を提供できます。これにより、Dateオブジェクトが返されます。 https://jsfiddle.net/Sushil231088/q56yd0rp/
"17/9/2014".toDate("dd/MM/yyyy", "/")
私が使用するjsで文字列を日付に変換するために http://momentjs.com/
moment().format('MMMM Do YYYY, h:mm:ss a'); // August 16th 2015, 4:17:24 pm
moment().format('dddd'); // Sunday
moment().format("MMM Do YY"); // Aug 16th 15
moment().format('YYYY [escaped] YYYY'); // 2015 escaped 2015
moment("20111031", "YYYYMMDD").fromNow(); // 4 years ago
moment("20120620", "YYYYMMDD").fromNow(); // 3 years ago
moment().startOf('day').fromNow(); // 16 hours ago
moment().endOf('day').fromNow(); // in 8 hours
それを行う別の方法:
String.prototype.toDate = function(format) {
format = format || "dmy";
var separator = this.match(/[^0-9]/)[0];
var components = this.split(separator);
var day, month, year;
for (var key in format) {
var fmt_value = format[key];
var value = components[key];
switch (fmt_value) {
case "d":
day = parseInt(value);
break;
case "m":
month = parseInt(value)-1;
break;
case "y":
year = parseInt(value);
}
}
return new Date(year, month, day);
};
a = "3/2/2017";
console.log(a.toDate("dmy"));
// Date 2017-02-03T00:00:00.000Z
あなたはこれを試すことができます:
function formatDate(userDOB) {
const dob = new Date(userDOB);
const monthNames = [
'January', 'February', 'March', 'April', 'May', 'June', 'July',
'August', 'September', 'October', 'November', 'December'
];
const day = dob.getDate();
const monthIndex = dob.getMonth();
const year = dob.getFullYear();
// return day + ' ' + monthNames[monthIndex] + ' ' + year;
return `${day} ${monthNames[monthIndex]} ${year}`;
}
console.log(formatDate('1982-08-10'));
日付形式に変換する前に文字列の内容を確認する必要がある場合:
// Convert 'M/D/YY' to Date()
mdyToDate = function(mdy) {
var d = mdy.split(/[\/\-\.]/, 3);
if (d.length != 3) return null;
// Check if date is valid
var mon = parseInt(d[0]),
day = parseInt(d[1]),
year= parseInt(d[2]);
if (d[2].length == 2) year += 2000;
if (day <= 31 && mon <= 12 && year >= 2015)
return new Date(year, mon - 1, day);
return null;
}
文字列を日付オブジェクトに変換するためのparseDateTime関数を作成し、それがすべてのブラウザー(IEブラウザーを含む)で機能していることを確認し ます。 -in-all-browser
function parseDateTime(datetime) {
var monthNames = [
"January", "February", "March",
"April", "May", "June", "July",
"August", "September", "October",
"November", "December"
];
if(datetime.split(' ').length == 3){
var date = datetime.split(' ')[0];
var time = datetime.split(' ')[1].replace('.00','');
var timearray = time.split(':');
var hours = parseInt(time.split(':')[0]);
var format = datetime.split(' ')[2];
var bits = date.split(/\D/);
date = new Date(bits[0], --bits[1], bits[2]); /* if you change format of datetime which is passed to this function, you need to change bits e.x ( bits[0], bits[1], bits[2 ]) position as per date, months and year it represent bits array.*/
var day = date.getDate();
var monthIndex = date.getMonth();
var year = date.getFullYear();
if ((format === 'PM' || format === 'pm') && hours !== 12) {
hours += 12;
try{ time = hours+':'+timearray[1]+':'+timearray[2] }catch(e){ time = hours+':'+timearray[1] }
}
var formateddatetime = new Date(monthNames[monthIndex] + ' ' + day + ' ' + year + ' ' + time);
return formateddatetime;
}else if(datetime.split(' ').length == 2){
var date = datetime.split(' ')[0];
var time = datetime.split(' ')[1];
var bits = date.split(/\D/);
var datetimevalue = new Date(bits[0], --bits[1], bits[2]); /* if you change format of datetime which is passed to this function, you need to change bits e.x ( bits[0], bits[1], bits[2 ]) position as per date, months and year it represent bits array.*/
var day = datetimevalue.getDate();
var monthIndex = datetimevalue.getMonth();
var year = datetimevalue.getFullYear();
var formateddatetime = new Date(monthNames[monthIndex] + ' ' + day + ' ' + year + ' ' + time);
return formateddatetime;
}else if(datetime != ''){
var bits = datetime.split(/\D/);
var date = new Date(bits[0], --bits[1], bits[2]); /* if you change format of datetime which is passed to this function, you need to change bits e.x ( bits[0], bits[1], bits[2 ]) position as per date, months and year it represent bits array.*/
return date;
}
return datetime;
}
var date1 = '2018-05-14 05:04:22 AM'; // yyyy-mm-dd hh:mm:ss A
var date2 = '2018/05/14 05:04:22 AM'; // yyyy/mm/dd hh:mm:ss A
var date3 = '2018/05/04'; // yyyy/mm/dd
var date4 = '2018-05-04'; // yyyy-mm-dd
var date5 = '2018-05-14 15:04:22'; // yyyy-mm-dd HH:mm:ss
var date6 = '2018/05/14 14:04:22'; // yyyy/mm/dd HH:mm:ss
console.log(parseDateTime(date1))
console.log(parseDateTime(date2))
console.log(parseDateTime(date3))
console.log(parseDateTime(date4))
console.log(parseDateTime(date5))
console.log(parseDateTime(date6))
**Output---**
Mon May 14 2018 05:04:22 GMT+0530 (India Standard Time)
Mon May 14 2018 05:04:22 GMT+0530 (India Standard Time)
Fri May 04 2018 00:00:00 GMT+0530 (India Standard Time)
Fri May 04 2018 00:00:00 GMT+0530 (India Standard Time)
Mon May 14 2018 15:04:22 GMT+0530 (India Standard Time)
Mon May 14 2018 14:04:22 GMT+0530 (India Standard Time)
この回答はKassemの回答に基づいていますが、2桁の年も処理します。カセムの回答を編集して送信しましたが、承認されなかった場合は、別の回答として送信します。
function stringToDate(_date,_format,_delimiter) {
var formatLowerCase=_format.toLowerCase();
var formatItems=formatLowerCase.split(_delimiter);
var dateItems=_date.split(_delimiter);
var monthIndex=formatItems.indexOf("mm");
var dayIndex=formatItems.indexOf("dd");
var yearIndex=formatItems.indexOf("yyyy");
var year = parseInt(dateItems[yearIndex]);
// adjust for 2 digit year
if (year < 100) { year += 2000; }
var month=parseInt(dateItems[monthIndex]);
month-=1;
var formatedDate = new Date(year,month,dateItems[dayIndex]);
return formatedDate;
}
stringToDate("17/9/14","dd/MM/yyyy","/");
stringToDate("17/9/2014","dd/MM/yyyy","/");
stringToDate("9/17/2014","mm/dd/yyyy","/")
stringToDate("9-17-2014","mm-dd-yyyy","-")
正規表現を使用して、文字列を解析して詳細な時刻を取得し、日付または次のような戻り形式を作成できます。
//example : let dateString = "2018-08-17 01:02:03.4"
function strToDate(dateString){
let reggie = /(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2}).(\d{1})/
, [,year, month, day, hours, minutes, seconds, miliseconds] = reggie.exec(dateString)
, dateObject = new Date(year, month-1, day, hours, minutes, seconds, miliseconds);
return dateObject;
}
alert(strToDate(dateString));
今日(2020.05.08)選択したソリューションのテストを実行します-2つのケース:入力日付がISO8601文字列(Ad、Bd、Cd、Dd、Ed)であり、入力日付がタイムスタンプ(At、Ct、Dt)です。ソリューションBd、Cd、Ctは結果としてjs Dateオブジェクトを返しませんが、便利なためそれらを追加していますが、有効なソリューションと比較していません。この結果は、大量の日付解析に役立ちます。
new Date
(広告)は、ISO日付とタイムスタンプのすべてのブラウザーで、moment.js(Dd)より50〜100倍高速です。new Date
(AD)は〜10倍より速いですparseDate
(エド)Date.parse
すべてのブラウザでISO日付からタイムスタンプを取得する必要がある場合、ソリューション(BD)が最も高速です。私は、Chrome 81.0、Safari 13.1、Firefox 75.0上のMacOs High Sierra 10.13.6でテストを実行しています。解決策parseDate
(編集)はnew Date(0)
、UTC日付コンポーネントを使用して手動で設定します。
クロムの結果
ISO 8601独自の日付文字列は、標準と同じくらい優れていますが、まだ広くサポートされていません。
これは、どの日付文字列形式を使用すべきかを判断するための優れたリソースです。
http://dygraphs.com/date-formats.html
はい、それはあなたの日付文字列が
"2014/10/13 23:57:52"
の代わりに
"2014-10-13 23:57:52"
このコードを使用する:(私の問題はこのコードで解決されました)
function dateDiff(date1, date2){
var diff = {} // Initialisation du retour
var tmp = date2 - date1;
tmp = Math.floor(tmp/1000); // Nombre de secondes entre les 2 dates
diff.sec = tmp % 60; // Extraction du nombre de secondes
tmp = Math.floor((tmp-diff.sec)/60); // Nombre de minutes (partie entière)
diff.min = tmp % 60; // Extraction du nombre de minutes
tmp = Math.floor((tmp-diff.min)/60); // Nombre d'heures (entières)
diff.hour = tmp % 24; // Extraction du nombre d'heures
tmp = Math.floor((tmp-diff.hour)/24); // Nombre de jours restants
diff.day = tmp;
return diff;
}
サーバーから日付文字列を取得するときに使用する再利用可能な関数を作成しました。メソッド
を使用するために、日、月、年を区切る目的の区切り文字(/-など)を渡すことができますsplit()
。
あなたはこの実用的な例でそれを見てテストすることができます。
<!DOCTYPE html>
<html>
<head>
<style>
</style>
</head>
<body>
<div>
<span>day:
</span>
<span id='day'>
</span>
</div>
<div>
<span>month:
</span>
<span id='month'>
</span>
</div>
<div>
<span>year:
</span>
<span id='year'>
</span>
</div>
<br/>
<input type="button" id="" value="convert" onClick="convert('/','28/10/1980')"/>
<span>28/10/1980
</span>
<script>
function convert(delimiter,dateString)
{
var splitted = dateString.split('/');
// create a new date from the splitted string
var myDate = new Date(splitted[2],splitted[1],splitted[0]);
// now you can access the Date and use its methods
document.getElementById('day').innerHTML = myDate.getDate();
document.getElementById('month').innerHTML = myDate.getMonth();
document.getElementById('year').innerHTML = myDate.getFullYear();
}
</script>
</body>
</html>
これを行うもう1つの方法は、フォーマット文字列に対して名前付きキャプチャグループを使用して正規表現を作成し、その正規表現を使用して日付文字列から日、月、年を抽出することです。
function parseDate(dateStr, format) {
const regex = format.toLocaleLowerCase()
.replace(/\bd+\b/, '(?<day>\\d+)')
.replace(/\bm+\b/, '(?<month>\\d+)')
.replace(/\by+\b/, '(?<year>\\d+)')
const parts = new RegExp(regex).exec(dateStr) || {};
const { year, month, day } = parts.groups || {};
return parts.length === 4 ? new Date(year, month-1, day) : undefined;
}
const printDate = x => console.log(x ? x.toLocaleDateString() : x);
printDate(parseDate('05/11/1896', 'dd/mm/YYYY'));
printDate(parseDate('07-12-2000', 'dd-mm-yy'));
printDate(parseDate('07:12:2000', 'dd:mm:yy'));
printDate(parseDate('2017/6/3', 'yy/MM/dd'));
printDate(parseDate('2017-6-15', 'y-m-d'));
printDate(parseDate('2015 6 25', 'y m d'));
printDate(parseDate('2015625', 'y m d')); // bad format