当前位置: 首页 > news >正文

NITZ 网络时间与时区同步架构

1. 概述

NITZ (Network Identity and Time Zone) 是 3GPP TS 22.042 定义的标准机制,允许移动网络通过 NAS 信令(MM Information / GMM Information)向 UE 下发当前时间、时区偏移和夏令时信息。Android Telephony 框架通过NitzStateMachine状态机处理 NITZ 信号,并将同步后的时间/时区建议发送给TimeDetectorService/TimeZoneDetectorService(系统级时间服务)。

1.1 NITZ 信号格式

yy/mm/dd,hh:mm:ss(±)tz[,dt[,tzid]]
示例含义
22/05/15,10:30:00+32,012022-05-15 10:30:00, UTC+8:00, DST+15min
22/05/15,10:30:00-20,002022-05-15 10:30:00, UTC-5:00, 无 DST
22/05/15,10:30:00+00,00,Asia/Shanghai含 Olson TZ ID(3GPP R9+)

2. 核心类与源码锚点

类名路径说明
NitzStateMachine[NitzStateMachine.java](file:///d:/Resource%20Android%2016/android-16/frameworks/opt/telephony/src/java/com/android/internal/telephony/NitzStateMachine.java)NITZ 状态机接口
NitzStateMachineImpl[NitzStateMachineImpl.java](file:///d:/Resource%20Android%2016/android-16/frameworks/opt/telephony/src/java/com/android/internal/telephony/nitz/NitzStateMachineImpl.java)NITZ 状态机实现
NitzData[NitzData.java](file:///d:/Resource%20Android%2016/android-16/frameworks/opt/telephony/src/java/com/android/internal/telephony/NitzData.java)NITZ 原始数据解析与封装
NitzSignal[NitzSignal.java](file:///d:/Resource%20Android%2016/android-16/frameworks/opt/telephony/src/java/com/android/internal/telephony/NitzSignal.java)NITZ 信号封装(含接收时间戳)
TimeZoneSuggesterImpl[TimeZoneSuggesterImpl.java](file:///d:/Resource%20Android%2016/android-16/frameworks/opt/telephony/src/java/com/android/internal/telephony/nitz/TimeZoneSuggesterImpl.java)时区建议生成器
TimeZoneLookupHelper[TimeZoneLookupHelper.java](file:///d:/Resource%20Android%2016/android-16/frameworks/opt/telephony/src/java/com/android/internal/telephony/nitz/TimeZoneLookupHelper.java)MCC+Country→TimeZone 查找
TimeServiceHelperImpl[TimeServiceHelperImpl.java](file:///d:/Resource%20Android%2016/android-16/frameworks/opt/telephony/src/java/com/android/internal/telephony/nitz/TimeServiceHelperImpl.java)系统时间/时区服务门面
NitzSignalInputFilterPredicateFactory[NitzSignalInputFilterPredicateFactory.java](file:///d:/Resource%20Android%2016/android-16/frameworks/opt/telephony/src/java/com/android/internal/telephony/nitz/NitzSignalInputFilterPredicateFactory.java)NITZ 信号输入过滤策略
ServiceStateTracker[ServiceStateTracker.java](file:///d:/Resource%20Android%2016/android-16/frameworks/opt/telephony/src/java/com/android/internal/telephony/ServiceStateTracker.java)监听EVENT_NITZ_TIME,解析 NITZ 字符串

3. NITZ 从 Modem 到系统的全链路

3.1 信号接收:Modem → RIL → ServiceStateTracker

// ServiceStateTracker.java — 注册 NITZ 监听mCi.setOnNITZTime(this,EVENT_NITZ_TIME,null);// ServiceStateTracker.java — 处理 EVENT_NITZ_TIMEcaseEVENT_NITZ_TIME:{ar=(AsyncResult)msg.obj;Object[]nitzArgs=(Object[])ar.result;StringnitzString=(String)nitzArgs[0];// NITZ 原始字符串longnitzReceiveTimeMs=((Long)nitzArgs[1]);// 框架收到的时间戳longageMs=0;if(nitzArgs.length>=3){ageMs=((Long)nitzArgs[2]);// NITZ 在 RIL/Modem 中缓存的时长}setTimeFromNITZString(nitzString,nitzReceiveTimeMs,ageMs);break;}

3.2 解析:NitzData.parse()

// NitzData.javapublicstaticNitzDataparse(Stringnitz){// "yy/mm/dd,hh:mm:ss(+/-)tz[,dt[,tzid]]"String[]nitzSubs=NITZ_SPLIT_PATTERN.split(nitz);intyear=Integer.parseInt(nitzSubs[0]);intmonth=Integer.parseInt(nitzSubs[1]);intday=Integer.parseInt(nitzSubs[2]);inthour=Integer.parseInt(nitzSubs[3]);intminute=Integer.parseInt(nitzSubs[4]);intsecond=Integer.parseInt(nitzSubs[5]);// 时区偏移:以 15 分钟为单位的整数intzoneOffset=Integer.parseInt(nitzSubs[6])*MS_PER_QUARTER_HOUR;// 夏令时偏移(可选)IntegerdstOffset=null;if(nitzSubs.length>=8){dstOffset=Integer.parseInt(nitzSubs[7])*MS_PER_QUARTER_HOUR;}// Olson 时区 ID(可选,3GPP R9+)TimeZoneemulatorHostTimeZone=null;if(nitzSubs.length>=9){emulatorHostTimeZone=TimeZone.getTimeZone(nitzSubs[8]);}longunixEpochTimeMillis=LocalDateTime.of(2000+year,month,day,hour,minute,second).toInstant(ZoneOffset.UTC).toEpochMilli();returnnewNitzData(nitz,zoneOffset,dstOffset,unixEpochTimeMillis,emulatorHostTimeZone);}

3.3 转发:NitzSignal → NitzStateMachineImpl

// ServiceStateTracker.java — setTimeFromNITZStringprivatevoidsetTimeFromNITZString(StringnitzString,longnitzReceiveTimeMs,longageMs){NitzDatanewNitzData=NitzData.parse(nitzString);mLastNitzData=newNitzData;if(newNitzData!=null){NitzSignalnitzSignal=newNitzSignal(nitzReceiveTimeMs,newNitzData,ageMs)
http://www.rkmt.cn/news/1471071.html

相关文章:

  • 2026年比较好的钢筋桁架楼承板/包头Z型钢/镀锌楼承板/包头楼承板优质厂家推荐榜 - 行业平台推荐
  • 第五章:让主角动起来——玩家角色创建
  • 2026年热门的防静电环氧地坪/混凝土浇筑/环氧磨石地坪公司哪家好 - 行业平台推荐
  • 2026年q2矿用车选型技术解析:矿用四不像运输车/矿用搅拌罐车/矿用无轨人车/从核心维度选对厂家 - 优质品牌商家
  • 当AI学会‘读心’:从AOL搜索数据泄露看NLP时代的隐私保卫战
  • 大模型算法学习2026.6.1
  • Anthropic发布Opus 4.8,首次超越OpenAI
  • 《和死对头成亲后》小说|下载|txt
  • Altium Designer新手避坑:从PCB设计到Gerber文件导出的完整流程与常见错误排查
  • C# 索引器 this[]
  • 随着树木和非树木植被覆盖的扩大,全球人口暴露于城市绿地的不平等加剧
  • 从‘边缘’到‘语义’:手把手教你用TensorBoard逐层可视化ResNet的‘认知’过程(PyTorch版)
  • 保姆级教程:用ROS1在局域网内搞定两台机器人的主从通信(含rqt_graph可视化验证)
  • SpringBoot项目升级Swagger3.0后,swagger-ui.html 404?别慌,一个注解和依赖就搞定
  • HoRain云--Claude Code 开发配置
  • Meta:智能体自主发现高效混合架构
  • 告别打印插件!纯前端JS调用斑马打印机打印二维码的保姆级教程(附ZPL指令详解)
  • 安徽广告道闸服务商大揭秘,2026年05月口碑之选在此,升降柱/导轨伸缩门/电动悬浮门,广告道闸集成服务商选哪家 - 品牌推荐师
  • 别再硬写样式了!用uni-app的midButton属性5分钟搞定中间凸起TabBar(H5/小程序通用)
  • 3D高斯泼溅技术与GaussianSwap人脸交换系统解析
  • Vivado秒表进阶玩法:如何给你的FPGA计时器增加小数点显示和时分秒格式切换?
  • 网络排障不求人:手把手教你配置中兴ZXR10-3928A的端口镜像(附完整命令)
  • 2026年美国留学中介哪家好,机构排名推荐与选机构避坑全流程指南 - 环球新视野
  • 如何快速搭建虚拟显示器:Parsec VDD新手完整指南
  • 终端环境下 AI 图像识别与生成实战:从手绘草稿到精美插画的完整方案
  • 2026年驻马店青少年教育学校评测:青少年教育基地、青少年行为矫正基地、青春期休学孩子矫正学校、休学孩子疗愈基地选择指南 - 优质品牌商家
  • 2026年知名的人形机器人/机器人/送餐机器人/迎宾机器人高口碑品牌推荐 - 行业平台推荐
  • 2026年q2国内玻璃酒瓶生产厂家综合实力排行:化妆品玻璃瓶/橄榄油玻璃瓶/红酒瓶/膏霜玻璃瓶/实力盘点 - 优质品牌商家
  • 2026年质量好的PP-WAX/PVC专用蜡/EBS/FT-WAX精选推荐公司 - 品牌宣传支持者
  • 从 `ffmpeg -buildconf` 输出里,我们能解读出什么?一份FFmpeg编译配置的深度解析