moment.js(JavaScript) vs Calendar(Java) vs DateTime(C#)

プログラム言語をまたいでいて、いつも迷うので書いておきます。

JavaScript、なぜ標準の Date型 ではなく moment.js なのかというと、今使っているのが moment だからです。

Left align moment.js(JavaScript) Calendar(Java) DateTime(C#)
文字列からのパース moment(text, format) Calendarにはない(DateFormatで代用) DateTime.Parse(text, culture)
年を取得 year() get(Calendar.YEAR) Year
月を取得 month() ※0〜 get(Calendar.MONTH) ※0〜 Month ※1〜
日を取得 date() get(Calendar.DATE) Day
曜日を取得 day() SUN:0〜 get(Calendar.DAY_OF_WEEK) SUN:1〜 DayOfWeek SUN:0〜
文字列へのフォーマット format(format) DateFormatで代用 ToString(format)

サンプル

2018年1月1日は 「月曜日」 です。 あと、parse や format は Locale や Culture などに依存かもしれないので、ここでは触れないけど要注意!

Moment.js(Node.js v8.9.0)

コード

const moment = require('moment');

const m = moment('20180101', 'YYYYMMDD');
console.log(`年=${m.year()}`);
console.log(`月=${m.month()}`);
console.log(`日=${m.date()}`);
console.log(`曜日=${m.day()}`);    // <---------曜日が day() で取れるなんて、わかるわけ…
console.log(`整形=${m.format('YYYY年MM月DD日')}`);

結果

年=2018
月=0                  <---------月は0から
日=1
曜日=1                <---------日曜=0から
整形=2018年01月01日

Calendar(Java v1.8.0)

コード

//import java.text.DateFormat;
//import java.text.SimpleDateFormat;
//import java.util.Date;
//import java.util.Calendar;
//import java.util.Locale;

DateFormat df = new SimpleDateFormat("yyyy/MM/dd", Locale.JAPAN);
Date d = df.parse("2018/01/01");
Calendar cal = Calendar.getInstance();
cal.setTime(d);

System.out.println("年=" + cal.get(Calendar.YEAR));
System.out.println("月=" + cal.get(Calendar.MONTH));
System.out.println("日=" + cal.get(Calendar.DATE));
System.out.println("曜日=" + cal.get(Calendar.DAY_OF_WEEK));
System.out.println("整形=" + df.format(cal.getTime()));

結果

年=2018
月=0                  <---------月は0から
日=1
曜日=2                <---------日曜=1から
整形=2018年01月01日

DateTime(C# / .NET Core 2.1)

コード

var d = DateTime.Parse("2018/01/01");
Console.WriteLine($"年={d.Year}");
Console.WriteLine($"月={d.Month}");
Console.WriteLine($"日={d.Day}");
Console.WriteLine($"曜日={d.DayOfWeek}({(int)d.DayOfWeek})");
Console.WriteLine($"整形={d.ToString("yyyy年MM月dd日")}");  // <------ MM だけ大文字だ

結果

年=2018
月=1             <---------月は1から
日=1
曜日=Monday(1)   <---------日曜=0から(Enumでも可)
整形=2018年01月01日

参考

Moment.js

Calendar(Java)

DateTime(C#/.NET)