多日历引擎
这个库用于在多卡路里系统(即. Ethiopic, Nepali等)跨DHIS-2应用. 它主要暴露两个 组件 :
- 钩子喜欢 使用日期选择器 用于构建UI组件(部分为@dhis/ui),例如: 日历 财务报告和审定财务报表 日历输入 组件.
- 帮助方法,比如
generateFixedPeriods财务报告和审定财务报表getNowInCalendar要处理 历代、日期操纵和计算 算计系统.
这个图书馆背后的想法是 抽象复杂的交易细节 在DHIS2中注明日期,并将其集中到一个地方供消费 不同的应用程序和图书馆.
内部,图书馆依靠 时间 API 密码 除其他外,旨在实现 目标,全力支持非希腊日历.
这个 文档 对该项目有一些要求和设计决定.
这个 吉拉史诗 列出应用程序 移动到使用图书馆, 以及接下来会发生什么.
API 密码
下面的一切都是从 @dhis2/multi-calendar-dates。见 API 和
实例 参数、返回值和示例.
帮助者
| 名称 | 说明 |
|---|---|
getNowInCalendar | 日历和时区的当前日期和时间 |
convertFromIso8601 | 将 ISO 8601 (希腊语) 日期转换为日历 |
convertToIso8601 | 将日历中的日期转换为 ISO 8601 (希腊语) |
addToCalendarDate | 在日历中添加或减去年数、月数和日数,将日数夹到月底 |
formatCalendarDate | 格式化日期为 yyyy-MM-dd 字符串 DHIS2 后端预期, 随时间而选择 |
getDaysInMonth | 日历中一个月中的天数 |
validateDateString | 对照格式、分/最大范围以及日历规则验证日期字符串。 回返a DateValidationResult 无效时的代码 |
固定期间
由数据条目等应用程序和分析库生成 不同日历中的固定时段列表(日、周、月、.) 系统.
| 名称 | 说明 |
|---|---|
generateFixedPeriods | 一年中所有时期类型, 在给定日历和地区 |
getFixedPeriodByDate | 包含日期的周期类型 |
createFixedPeriodFromPeriodId | 重建一个段从它的ID,例如. 202301 |
getAdjacentFixedPeriods | N 期之前或之后 |
钩子等
钩被出口,但大多是内部使用的: @dhis2/ui是因为
日历 财务报告和审定财务报表
日历输入。大多数应用程序使用
这些部件,而不是直接的钩子.
| 名称 | 说明 |
|---|---|
useDatePicker | 返回日历拾取器的周网格、日标签和导航状态的钩 |
useResolvedDirection | 从语言中解析文本方向( LTR/ RTL) 的钩, 或明确覆盖 |
periodTypes | 所有支持的周期类型 IDs |
constants.calendars | 支持的日历 ID |
constants.numberingSystems | 支持的+R 编号系统代码 |
DateValidationResult | 密码 validateDateString 当日期无效时返回 |
CalendarDate, (中文(简体) ), CalendarDateTime (类型) | { year, month, day, eraYear? },同样加 hour, (中文(简体) ), minute 财务报告和审定财务报表 second。读取年份为 eraYear ?? year |
日历 UI 的钩
图书馆提供钩子 useDatePicker 被阴道所消耗
日历组件。 目前使用它有两个组件:
useDatePicker 使用一个
日期选择选项
对象,并返回
使用日期选择器返回
包含使UI组件,即本地化的
日期名称,以及当前视图中的周数(月份).
// the options passed to useDatePicker
type DatePickerOptions = {
date: string
options: PickerOptions
onDateSelect: (payload: OnDateSelectPayload) => void
minDate?: string
maxDate?: string
format?: 'YYYY-MM-DD' | 'DD-MM-YYYY'
strictValidation?: boolean
}
type OnDateSelectPayload = { calendarDateString: string } | null
// the return type of the hook
type UseDatePickerReturn = UseNavigationReturnType & {
weekDayLabels: string[]
calendarWeekDays: {
dateValue: string
label: string | number
onClick: () => void
isSelected: boolean | undefined
isToday: boolean
isInCurrentMonth: boolean
}[][]
}
特殊情况和有时期逻辑的考虑
在计算期间时,有一些特殊的DHIS2-特定案例: 我们处理。 测试和黄瓜特征中记录了这些特征 文档。 其中包括:
- 在埃塞俄比亚历法中处理第13个月:埃塞俄比亚人 日历有13个月:12个月30天,然后第13个月有5个或 6天取决于它是否是一个跳跃年. 生成时 双周或更短的期间(双周、周、日),然后是第13个 月份显示 。 但是,当我们产生月期或 更大的,我们不显示 第13个月。 后端就变成 决定将第13个月的任何数据列入何处,因此在这样做时 每月分析,第13个月 将与下一个月 数据.
- 期间的ID由后端决定,它们使用Gregorian
月份名称,例如,
QuarterlyNov或者说QuarterlyApr在 前端,在一个非希腊日历中,Nov将被翻译为 目前历法系统的第11个月(Hamle in Ethiopic). 理想的是,我们 未来会有日历不可知的时期ID, 但是这个 暂时是解决之道. - 从前端角度来说,我们总是在日历中发送日期
系统。 格式化为类似ISO的格式(
yyyy-MM-dd) (中文(简体) ). 没错 “ISO类似”,因为日期实际上在日历系统中而不是 gregorian ISO8601 日历。 所以,当一个系统设置到Ethiopic,发送2015-01-01到后端,表示2015年的Ethiopic(即 2022 in Gregorian (英语). 这是后端所期望的 如果有的话 需要转换,然后发生在后端.- 鉴于前端有临时物体 我们有能力 发送日期转换为Gregorian, 但这就是后端 期待现在.
- 尼泊尔语作为自定义日历执行:见
内帕利卡伦达尔。 。 。 .
尼泊尔历法是单索拉历法,这意味着月长可以
年复一年,情况不一。 Temperal的算术方式是
将一天转换为格勒戈里安,进行算术,然后转换
返回日历。 这导致了奇怪的情况 你这样做
nepaliDate.add({month: 1})例如,结果仍然是 (因为这个月在格雷戈里安有30天,但在尼泊尔有32天) (例如,A/CN.9/WG.III/WP.III/WP.1号文件)。 为了绕过去,我们 将一天设定为 第十四届 在算术之前(以时期生成为背景) 导致在DHIS2背景下产生有意义的结果. - 尼泊尔语在主要浏览器中也不作为地语支持. 所以我们依靠
用硬码地图定位它,意味着我们没有同样的
显示例如短或长的日或月名称的灵活性
与
.toLocaleString这意味着消费者只能使用其中的一种ne-NP或者说en-NP(nepali 月和日译为英文) 一个带有尼泊尔日历的地块, 他们不能使用浏览器本地化 (因此他们无法以法语为例显示尼泊尔语月名) 如果有埃蒂奥皮克或伊斯兰日历,就能够这样做. - 在Ethiopic日历中,当消耗一个日期时使用
.eraYear而不是说.year以获得一年的一部分约会。 目前正在讨论 决定哪个时代应该属于 默认,但它可能是依赖浏览器 结尾,所以它更安全 用于eraYear这是埃塞俄比亚用户期望看到的。 我们 在图书馆里抽象地看待这种区别,但是没有 很简单的解决方案. - 图书馆还收集了一些DHIS2与《公约》的具体不一致之处
后端可以方便图书馆的消费者. 例如,它已经
从 DHIS2 所用的日历标识转换成预期的标识的地图
图书馆:
dhis2 加仑达斯地图。 。 。 .
这些地图是“thiopian”(在DHIS2中使用)到“ethiopic”,这是标准
JavaScript (在 Unicode-%R 密码) (中文(简体) ). 这个
ưμ㼯A
在 JavaScript 上下文(即来自
ar_SD改为ar-SD) (中文(简体) ).
结构决定记录
- 记录架构决定
- 使用临时API作为支柱 引擎
- 将临时多填充器升级为0.5.x,不用自定义 日历 (3.0.0分解变化)