概述
App Inventor 2的 Clock 组件是时间处理的核心工具,可以实现:
- 获取当前时间
- 时间格式化显示
- 时间戳转换(Unix Timestamp)
- 时间差计算
- 定时器和计时器
- 倒计时功能
Clock组件位于组件面板的 Sensors 分类下。
Clock组件核心方法
| 方法 | 说明 |
|---|---|
| Now() | 获取当前时间(Instant) |
| FormatDateTime(instant, pattern) | 格式化时间 |
| GetMillis(instant) | 获取毫秒时间戳 |
| MakeInstant(from) | 从文本创建时间 |
| MakeInstantFromMillis(ms) | 从毫秒创建时间 |
| Duration(start, end) | 计算时间差 |
| AddDuration(instant, duration) | 时间加偏移 |
获取和显示当前时间
基本显示
当 Screen1.初始化
设 当前时间 = Clock1.当前时间()
设 显示 = Clock1.格式化日期时间(当前时间, "yyyy-MM-dd HH:mm:ss")
标签_时间.文本 = 显示
实时更新
当 Screen1.初始化
设 Clock1.计时器间隔 = 1000 ' 1秒更新
设 Clock1.启用计时器 = true
当 Clock1.计时
设 当前时间 = Clock1.当前时间()
标签_时间.文本 = Clock1.格式化日期时间(当前时间, "HH:mm:ss")
标签_日期.文本 = Clock1.格式化日期时间(当前时间, "yyyy年MM月dd日 EEEE")
格式化模板
| 符号 | 含义 | 示例 |
|---|---|---|
| yyyy | 4位年份 | 2026 |
| MM | 2位月份 | 05 |
| dd | 2位日期 | 18 |
| HH | 24小时制 | 14 |
| hh | 12小时制 | 02 |
| mm | 分钟 | 30 |
| ss | 秒 | 45 |
| EEEE | 星期全称 | 星期一 |
| EE | 星期简称 | 周一 |
| a | AM/PM | 下午 |
常用格式
设 时间 = Clock1.当前时间()
' 2026-05-18 14:30:45
设 格式1 = Clock1.格式化日期时间(时间, "yyyy-MM-dd HH:mm:ss")
' 2026年5月18日 星期一
设 格式2 = Clock1.格式化日期时间(时间, "yyyy年M月d日 EEEE")
' 14:30
设 格式3 = Clock1.格式化日期时间(时间, "HH:mm")
' 下午 2:30
设 格式4 = Clock1.格式化日期时间(时间, "a h:mm")
Unix时间戳转换
获取当前时间戳
当 按钮_获取时间戳.被点击
设 毫秒时间戳 = Clock1.获取毫秒数(Clock1.当前时间())
设 秒时间戳 = 毫秒时间戳 / 1000
标签_时间戳.文本 = "Unix时间戳:" & 数学.向下取整(秒时间戳)
时间戳转日期
当 按钮_时间戳转日期.被点击
设 输入时间戳 = 文本转数字(输入框_时间戳.文本)
设 毫秒 = 输入时间戳 * 1000
设 时间对象 = Clock1.从毫秒创建时间(毫秒)
标签_日期.文本 = Clock1.格式化日期时间(时间对象, "yyyy-MM-dd HH:mm:ss")
日期转时间戳
当 按钮_日期转时间戳.被点击
设 日期文本 = "2026-05-18 14:30:00"
设 时间对象 = Clock1.从字符串创建时间(日期文本)
设 毫秒时间戳 = Clock1.获取毫秒数(时间对象)
设 秒时间戳 = 数学.向下取整(毫秒时间戳 / 1000)
标签_时间戳.文本 = "时间戳:" & 秒时间戳
时间差计算
计算两个时间的差
定义 计算时间差(开始文本, 结束文本) 返回 差值文本
设 开始时间 = Clock1.从字符串创建时间(开始文本)
设 结束时间 = Clock1.从字符串创建时间(结束文本)
设 开始毫秒 = Clock1.获取毫秒数(开始时间)
设 结束毫秒 = Clock1.获取毫秒数(结束时间)
设 差毫秒 = 结束毫秒 - 开始毫秒
设 天数 = 数学.向下取整(差毫秒 / (1000 * 60 * 60 * 24))
设 剩余 = 差毫秒 模 (1000 * 60 * 60 * 24)
设 小时 = 数学.向下取整(剩余 / (1000 * 60 * 60))
设 剩余 = 剩余 模 (1000 * 60 * 60)
设 分钟 = 数学.向下取整(剩余 / (1000 * 60))
设 秒 = 数学.向下取整((剩余 模 (1000 * 60)) / 1000)
返回 天数 & "天" & 小时 & "小时" & 分钟 & "分" & 秒 & "秒"
计算距今天多少天
定义 距今天数(日期文本) 返回 天数
设 目标日期 = Clock1.从字符串创建时间(日期文本)
设 今天 = Clock1.当前时间()
设 差毫秒 = Clock1.获取毫秒数(目标日期) - Clock1.获取毫秒数(今天)
返回 数学.向下取整(差毫秒 / (1000 * 60 * 60 * 24))
使用Clock.Duration方法
设 持续时间 = Clock1.持续时间(开始时间, 结束时间)
设 毫秒 = Clock1.持续时间毫秒(持续时间)
设 秒 = Clock1.持续时间秒(持续时间)
设 分钟 = Clock1.持续时间分钟(持续时间)
设 小时 = Clock1.持续时间小时(持续时间)
设 天数 = Clock1.持续时间天数(持续时间)
倒计时器
实现倒计时
设 目标时间 = 0
设 剩余毫秒 = 0
当 按钮_开始倒计时.被点击
设 分钟数 = 文本转数字(输入框_分钟.文本)
设 现在 = Clock1.获取毫秒数(Clock1.当前时间())
设 目标时间 = 现在 + 分钟数 * 60 * 1000
设 Clock1.计时器间隔 = 100
设 Clock1.启用计时器 = true
当 Clock1.计时
设 现在 = Clock1.获取毫秒数(Clock1.当前时间())
设 剩余 = 目标时间 - 现在
如果 剩余 ≤ 0
标签_倒计时.文本 = "00:00"
设 Clock1.启用计时器 = false
调用 通知.显示信息("⏰ 时间到!", "倒计时结束")
否则
设 分 = 数学.向下取整(剩余 / (1000 * 60))
设 秒 = 数学.向下取整((剩余 模 (1000 * 60)) / 1000)
标签_倒计时.文本 = 文本格式("%02d:%02d", 分, 秒)
秒表/计时器
设 开始时间 = 0
设 是否运行 = false
设 已用时间 = 0
当 按钮_开始.被点击
设 是否运行 = true
设 开始时间 = Clock1.获取毫秒数(Clock1.当前时间()) - 已用时间
设 Clock_秒表.计时器间隔 = 50
设 Clock_秒表.启用计时器 = true
当 按钮_暂停.被点击
设 是否运行 = false
设 Clock_秒表.启用计时器 = false
当 按钮_重置.被点击
设 是否运行 = false
设 已用时间 = 0
设 Clock_秒表.启用计时器 = false
标签_计时.文本 = "00:00.000"
当 Clock_秒表.计时
如果 是否运行
设 现在 = Clock1.获取毫秒数(Clock1.当前时间())
设 已用时间 = 现在 - 开始时间
设 分 = 数学.向下取整(已用时间 / 60000)
设 秒 = 数学.向下取整((已用时间 模 60000) / 1000)
设 毫秒 = 已用时间 模 1000
标签_计时.文本 = 文本格式("%02d:%02d.%03d", 分, 秒, 毫秒)
Text to Date / Date to Text
Text转Date
设 日期文本 = "2026-05-18"
设 时间对象 = Clock1.从字符串创建时间(日期文本)
' 也可以指定格式
设 日期文本2 = "05/18/2026"
设 时间对象2 = Clock1.从字符串创建时间(日期文本2)
提取时间的各个部分
设 时间 = Clock1.当前时间()
设 年 = Clock1.年(时间)
设 月 = Clock1.月(时间)
设 日 = Clock1.日(时间)
设 时 = Clock1.时(时间)
设 分 = Clock1.分(时间)
设 秒 = Clock1.秒(时间)
设 星期 = Clock1.星期几(时间) ' 1=周日, 2=周一...7=周六
常见问题
Q1: Clock1.MakeInstant解析日期失败?
MakeInstant支持以下格式:
yyyy-MM-dd→2026-05-18MM/dd/yyyy→05/18/2026yyyy-MM-ddTHH:mm:ss→2026-05-18T14:30:00
如果不支持你的格式,先用文本处理转换。
Q2: 时区问题?
Clock组件使用设备本地时区。如需UTC时间:
- 获取毫秒时间戳就是UTC
- 格式化显示会自动转为本地时区
Q3: 获取启动值/获取启动时间?
Screen的 get start value 积木块在 Control 分类中,用于屏幕间传值。Clock没有”获取启动时间”的概念,用 Clock1.Now() 获取当前时间即可。
总结
| 需求 | 方法 |
|---|---|
| 当前时间 | Clock.Now() + FormatDateTime() |
| 时间戳→日期 | MakeInstantFromMillis() |
| 日期→时间戳 | GetMillis() |
| 时间差 | GetMillis相减 / Duration() |
| 倒计时 | Clock.Timer + 毫秒计算 |
| 秒表 | 记录开始毫秒 + Timer更新 |
| 日期各部分 | Clock.Year/Month/Day/Hour等 |
版权声明:MIT App Inventor 官方文档采用 CC BY-SA 4.0 授权,本文档由 ai2claw 🐝 整理。
扫码添加客服咨询