# Unicode 标记

URL: https://caijiao.org/date-fns/general/Unicode-Tokens
Source: docs/date-fns/general/Unicode-Tokens.md
Description: 从 v2 开始，格式化和解析使用 Unicode 标记。标记不同于 Moment.js 和其他选择使用自定义格式规则的库。 虽然使用标准可确保库的兼容性和未来，但它会引起本文档打算解决的混乱。

从 v2 开始，`format`和`parse`使用 [Unicode 标记]([Unicode Locale Data Markup Language (LDML) Part 4: Dates](https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table))。

这些标记不同于 Moment.js 和其他选择使用自定义格式规则的库。 虽然使用标准可确保库的兼容性和未来，但它会引起本文档打算解决的混乱。

## 流行的错误

有 4 个标记会导致大多数混淆：

表示一年中的某一天（1、2、...、365、366）的 `D` 和 `DD` 经常与表示一个月中的某一天（1、2、...、31）的 `d` 和 `dd` 混淆。

`YY` 和 `YYYY `代表当地的周编号年份（44、01、00、17）经常与代表日历年的 `yy` 和 `yyyy` 混淆。

```javascript
// ❌ Wrong!
format(new Date(), 'YYYY-MM-DD')
//=> 2018-10-283

// ✅ Correct
format(new Date(), 'yyyy-MM-dd')
//=> 2018-10-10

// ❌ Wrong!
parse('11.02.87', 'D.MM.YY', new Date()).toString()
//=> 'Sat Jan 11 1986 00:00:00 GMT+0200 (EET)'

// ✅ Correct
parse('11.02.87', 'd.MM.yy', new Date()).toString()
//=> 'Wed Feb 11 1987 00:00:00 GMT+0200 (EET)'
```

为了帮助解决这个问题，如果 D 和 DD 的 `useAdditionalDayOfYearToken`s 选项和 `YY` 和 `YYYY` 的 `useAdditionalWeekYearTokens` 选项，`format`和`parse`函数将不会接受这些令牌：

```javascript
format(new Date(), 'D', { useAdditionalDayOfYearTokens: true })
//=> '283'

parse('365+1987', 'DD+YYYY', new Date(), {
  useAdditionalDayOfYearTokens: true,
  useAdditionalWeekYearTokens: true
}).toString()
//=> 'Wed Dec 31 1986 00:00:00 GMT+0200 (EET)'
```
