时间格式本地化 Cluster(TimeFormatLocalization)

Cluster ID: 0x002C  |  所在 Endpoint: Endpoint 0(Root) |  角色: Server(通过 Write 属性配置,无命令)

TimeFormatLocalization 控制设备上的时间和日期显示格式偏好。 它不负责时间本身的获取或同步(那是 TimeSynchronization Cluster 的工作), 而是决定设备在屏幕、面板等界面上怎么展示时间 —— 用 12 小时制还是 24 小时制,用公历还是其他日历。

这个 Cluster 非常精简 —— 最少只有 1 个属性(HourFormat), 支持 CALFMT Feature 时再增加 2 个日历相关属性。没有任何命令,所有配置都通过直接写属性完成。

什么时候用

用户拿到一台带屏幕的智能设备(恒温器、智能面板、带显示的门锁), 发现上面的时间显示是 12 小时制,想改成 24 小时制?写一下 HourFormat 就行。 需要在设备屏幕上显示农历日期?先确认设备支持 CALFMT Feature,然后写 ActiveCalendarType。

Feature 位图

TimeFormatLocalization 通过 FeatureMap(0xFFFC)声明设备是否支持日历格式配置:

Bit 0
CALFMT(CalendarFormat) 日历格式 —— 支持 ActiveCalendarType 和 SupportedCalendarTypes 两个属性,可切换公历、农历等不同日历系统
Feature 影响哪些属性

HourFormat 是必须支持的,与 Feature 无关。 只有当设备声明了 CALFMT Feature 时,ActiveCalendarType 和 SupportedCalendarTypes 才可用。 简单的设备(如只有时钟显示的插座)通常不支持 CALFMT,只有 HourFormat 一个属性。

属性总览

TimeFormatLocalization 最多有 3 个属性,其中 2 个依赖 CALFMT Feature。点击属性 ID 可跳转到详细说明。

ID 名称 类型 读写 Feature 说明
0x00 HourFormat enum8 读写 - 时间显示格式(12/24 小时制)
0x01 ActiveCalendarType enum8 读写 CALFMT 当前使用的日历类型
0x02 SupportedCalendarTypes list<enum8> 只读 CALFMT 设备支持的所有日历类型列表

HourFormat(时间显示格式)

控制设备以 12 小时制还是 24 小时制显示时间。这是 TimeFormatLocalization 唯一的必须属性, 所有支持此 Cluster 的设备都必须实现。可读可写,直接写属性即可切换。

HourFormatEnum 枚举值

0
12hr 12 小时制,带 AM/PM(如 2:30 PM)
1
24hr 24 小时制(如 14:30)
0xFF
UseActiveLocale 跟随当前语言区域设置自动决定(由 LocalizationConfiguration Cluster 的 ActiveLocale 决定)
UseActiveLocale 的行为

当 HourFormat 设为 0xFF(UseActiveLocale)时,设备会根据 LocalizationConfiguration Cluster 中的 ActiveLocale 属性自动选择时间格式。 例如 en-US 自动使用 12 小时制,zh-CN 自动使用 24 小时制。 这是最省心的选择,让设备自己跟随语言设置。

写属性示例(切换为 12 小时制):

// App → Device:将时间显示切换为 12 小时制
{
  "writeRequests": [{
    "attributePath": {
      "endpointId": 0,
      "clusterId": "0x002C",
      "attributeId": "0x00"        // HourFormat
    },
    "data": 0                      // 12hr
  }]
}

ActiveCalendarType(当前日历类型)

控制设备使用哪种日历系统来显示日期。可读可写,但只能写入 SupportedCalendarTypes 列表中包含的值。 需要设备支持 CALFMT Feature,否则此属性不存在。

CalendarTypeEnum 枚举值

0
Buddhist 佛历(泰国、斯里兰卡等国使用)
1
Chinese 中国农历(含节气、生肖)
2
Coptic 科普特历(埃及科普特教会使用)
3
Ethiopian 埃塞俄比亚历
4
Gregorian 公历(全球通用,最常见)
5
Hebrew 希伯来历(犹太历)
6
Indian 印度国定历
7
Islamic 伊斯兰历(回历)
8
Japanese 日本和历(令和、平成等年号)
9
Korean 韩国檀纪历
10
Persian 波斯历(伊朗历)
11
Taiwanese 民国纪年
0xFF
UseActiveLocale 跟随当前语言区域设置自动决定
写入前先检查支持列表

不是所有设备都支持全部 12 种日历。写入 ActiveCalendarType 之前, 必须先读取 SupportedCalendarTypes 确认目标日历在列表中。 写入不支持的值会被设备拒绝(返回 CONSTRAINT_ERROR)。

写属性示例(切换为中国农历):

// App → Device:将日历切换为中国农历
{
  "writeRequests": [{
    "attributePath": {
      "endpointId": 0,
      "clusterId": "0x002C",
      "attributeId": "0x01"        // ActiveCalendarType
    },
    "data": 1                      // Chinese(中国农历)
  }]
}

SupportedCalendarTypes(支持的日历列表)

只读属性,返回设备支持的所有日历类型列表。列表中的每个元素都是 CalendarTypeEnum 的一个值。 App 应该用这个列表来构建日历选择的 UI —— 只展示设备实际支持的选项。 需要设备支持 CALFMT Feature。

开发建议

读取 SupportedCalendarTypes 后,用它动态生成设置页面的日历选项列表。 大多数设备只会支持 Gregorian(公历)和当地常用的一两种日历, 不要硬编码全部 12 种。如果列表里只有一项,可以考虑隐藏日历切换入口。

示例数据

读取一台支持 CALFMT Feature 的智能恒温器的 TimeFormatLocalization 属性:

{
  // --- 时间格式 ---
  "0x00": 1,              // HourFormat = 24hr(24 小时制)

  // --- 日历格式(需 CALFMT Feature)---
  "0x01": 4,              // ActiveCalendarType = Gregorian(公历)
  "0x02": [4, 0, 1]       // SupportedCalendarTypes = [Gregorian, Buddhist, Chinese]
}

常见场景

场景 1:恒温器时间格式设置

用户新装了一台智能恒温器,屏幕上显示的是 12 小时制(如 2:30 PM), 习惯 24 小时制的用户希望通过 App 切换显示格式。

  1. 读取 HourFormat 确认当前值为 0(12hr)
  2. App 设置页展示三个选项:12 小时制、24 小时制、跟随系统语言
  3. 用户选择 24 小时制,App 写入 HourFormat = 1(24hr)
  4. 设备屏幕立即从「2:30 PM」变为「14:30」
  5. 如果设备支持 CALFMT,同一设置页还可以展示日历切换选项
场景 2:多地区智能面板的日历本地化

一款面向全球市场的智能家居面板,主屏幕显示日期和时间。 不同地区的用户需要看到不同的日历格式 —— 中国用户想看农历,中东用户想看伊斯兰历。

  1. 读取 FeatureMap 确认设备支持 CALFMT(Bit 0 = 1)
  2. 读取 SupportedCalendarTypes,假设返回 [4, 1, 7](公历、农历、伊斯兰历)
  3. App 设置页根据列表动态生成选项,附上本地化名称:「公历」「农历」「伊斯兰历」
  4. 中国用户选择农历,App 写入 ActiveCalendarType = 1(Chinese)
  5. 面板屏幕日期区域从「2024-09-22」变为同时显示「甲辰年八月二十」
  6. 也可以设为 UseActiveLocale (0xFF),让面板根据语言设置自动选择合适的日历