# 日付時刻フィールドタイプ

## 日付時刻フィールドタイプ

日付時刻フィールドタイプには、以下の種類があります。

- **日付時刻（タイムゾーンあり）** - 日付時刻はすべてUTC（協定世界時）に変換され、必要に応じてタイムゾーンの調整が行われます。
- **日付時刻（タイムゾーンなし）** - タイムゾーン情報を含まない日付と時刻を保存します。
- **日付（時刻なし）** - 日付情報のみを保存し、時刻部分は含みません。
- **時刻** - 時刻情報のみを保存し、日付部分は含みません。
- **Unix タイムスタンプ** - Unixタイムスタンプとして保存されます。通常、1970年1月1日からの経過秒数を表します。

各日付時刻関連フィールドタイプの例を以下に示します。

| **フィールドタイプ**         | **例**                     | **説明**                                   |
|----------------------------|---------------------------|--------------------------------------------|
| 日付時刻（タイムゾーンあり）    | 2024-08-24T07:30:00.000Z   | UTC（協定世界時）に変換され、タイムゾーンの調整が可能です      |
| 日付時刻（タイムゾーンなし）  | 2024-08-24 15:30:00        | タイムゾーンを考慮せず、日付と時刻のみを記録します             |
| 日付（時刻なし）             | 2024-08-24                 | 日付情報のみを保存し、時刻は含みません                     |
| 時刻                       | 15:30:00                   | 時刻情報のみを保存し、日付は含みません                     |
| Unix タイムスタンプ        | 1724437800                 | UTC 1970年1月1日00:00:00からの経過秒数を表します |

## 各データソースの比較

NocoBase、MySQL、およびPostgreSQLの対応表を以下に示します。

| **フィールドタイプ**       | **NocoBase**               | **MySQL**          | **PostgreSQL**                |
|--------------------------|-----------------------------|--------------------|-------------------------------|
| 日付時刻（タイムゾーンあり）   | Datetime with timezone    | TIMESTAMP<br/> DATETIME | TIMESTAMP WITH TIME ZONE      |
| 日付時刻（タイムゾーンなし）  | Datetime without timezone  | DATETIME           | TIMESTAMP WITHOUT TIME ZONE   |
| 日付（時刻なし）             | Date                      | DATE                 | DATE                          |
| 時刻                       | Time                     | TIME                 | TIME WITHOUT TIME ZONE        |
| Unix タイムスタンプ        | Unix timestamp            | INTEGER<br/>BIGINT   | INTEGER<br/>BIGINT              |
| 時刻（タイムゾーンあり）      | -                         | -                  | TIME WITH TIME ZONE           |

備考：
- MySQLの`TIMESTAMP`型は、UTC `1970-01-01 00:00:01`から`2038-01-19 03:14:07`までの範囲をカバーします。この範囲を超える日付や時刻を扱う場合は、`DATETIME`または`BIGINT`を使用してUnixタイムスタンプを保存することをお勧めします。

## 日付時刻の保存処理フロー

### タイムゾーンあり

これには`日付時刻（タイムゾーンあり）`と`Unix タイムスタンプ`が含まれます。

![20240824191933](https://static-docs.nocobase.com/20240824191933.png)

備考：
- より広範な日付範囲をサポートするため、NocoBaseの日付時刻（タイムゾーンあり）フィールドでは、MySQLデータベースで`DATETIME`型を使用しています。保存される日付値は、サーバーの`TZ`環境変数に基づいて変換された値です。そのため、`TZ`環境変数が変更されると、保存されている日付時刻の値も変化します。
- UTCとローカルタイムにはタイムゾーンの差があるため、UTCの生の値（オリジナル値）を直接表示すると、ユーザーが誤解する可能性があります。

### タイムゾーンなし

![20240824185600](https://static-docs.nocobase.com/20240824185600.png)

## UTC

UTC（協定世界時、Coordinated Universal Time）は、世界中の時間を調整・同期するために使用されるグローバルな時間標準です。原子時計に基づいた高精度な時間標準であり、地球の自転と同期しています。

UTCとローカルタイムにはタイムゾーンの差があるため、UTCの生の値（オリジナル値）を直接表示すると、ユーザーが誤解を招く可能性があります。例えば、以下のようになります。

| **タイムゾーン**   | **日付時刻**                      |
|--------------------|----------------------------------|
| UTC                | 2024-08-24T07:30:00.000Z          |
| 東8区 (UTC+8)      | 2024-08-24 15:30:00               |
| 東5区 (UTC+5)      | 2024-08-24 12:30:00               |
| 西5区 (UTC-5)      | 2024-08-24 02:30:00               |
| イギリス時間 (UTC+0) | 2024-08-24 07:30:00              |
| 中部時間 (UTC-6)   | 2024-08-23 01:30:00              |

これらはすべて同じ時刻を表していますが、タイムゾーンが異なるだけです。