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() **※０〜**              |get(Calendar.MONTH) **※０〜** |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)

**コード**

```javascript
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                <---------日曜=０から
整形=2018年01月01日
```

### Calendar(Java v1.8.0)

**コード**

```java
//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)

**コード**

```csharp
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)   <---------日曜=０から(Enumでも可)
整形=2018年01月01日
```

## 参考

### Moment.js

* [Moment.js / Home](https://momentjs.com/)
* [[Javascript] Moment.jsを使って日付を扱おう - YoheiM .NET](https://www.yoheim.net/blog.php?q=20180201)

### Calendar(Java)

* [【Java入門】Calendarの日付フォーマットを指定する(format) | 侍エンジニア塾ブログ | プログラミング入門者向け学習情報サイト](https://www.sejuku.net/blog/20325)
* [Java - string型をcalender型に変換したい(33597)｜teratail](https://teratail.com/questions/33597)
* [[ Java ] 日付に対応する曜日を取得する (Calendar.DAY_OF_WEEK) – 行け！偏差値40プログラマー](http://hensa40.cutegirl.jp/archives/5373)
* [SimpleDateFormatのparseでコケるときに確認すること #60 - ゆるふわ技術日誌](https://yurufuwa-tech.hatenablog.com/entry/2017/07/13/222455)

### DateTime(C#/.NET)

* [日時を表す文字列をDateTimeオブジェクトに変換する - .NET Tips (VB.NET,C#...)](https://dobon.net/vb/dotnet/string/datetimeparse.html#section1)
* [日付や時刻を文字列に変換するには？：.NET TIPS - ＠IT](http://www.atmarkit.co.jp/ait/articles/0408/27/news104.html)