概述
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) | 时间加偏移 |
获取和显示当前时间
基本显示
when Screen1.Initialize() {
var 当前时间 = 计时器1.Now()
var 显示 = 计时器1.FormatDateTime(当前时间, "yyyy-MM-dd HH:mm:ss")
标签_时间.Text = 显示
}
实时更新
when Screen1.Initialize() {
计时器1.TimerInterval = 1000 // 1秒更新
计时器1.TimerEnabled = true
}
when 计时器1.Timer() {
var 当前时间 = 计时器1.Now()
标签_时间.Text = 计时器1.FormatDateTime(当前时间, "HH:mm:ss")
标签_日期.Text = 计时器1.FormatDateTime(当前时间, "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 | 下午 |
常用格式
global 时间 = 计时器1.Now()
// 2026-05-18 14:30:45
global 格式1 = 计时器1.FormatDateTime(时间, "yyyy-MM-dd HH:mm:ss")
// 2026年5月18日 星期一
global 格式2 = 计时器1.FormatDateTime(时间, "yyyy年M月d日 EEEE")
// 14:30
global 格式3 = 计时器1.FormatDateTime(时间, "HH:mm")
// 下午 2:30
global 格式4 = 计时器1.FormatDateTime(时间, "a h:mm")
Unix时间戳转换
获取当前时间戳
when 按钮_获取时间戳.Click() {
var 毫秒时间戳 = 计时器1.GetMillis(计时器1.Now())
var 秒时间戳 = 毫秒时间戳 / 1000
标签_时间戳.Text = join("Unix时间戳:", floor(秒时间戳))
}
时间戳转日期
当 按钮_时间戳转日期.被点击
设 输入时间戳 = 文本转数字(输入框_时间戳.文本)
设 毫秒 = 输入时间戳 * 1000
设 时间对象 = 计时器1.从毫秒创建时间(毫秒)
标签_日期.文本 = 计时器1.格式化日期时间(时间对象, "yyyy-MM-dd HH:mm:ss")
日期转时间戳
when 按钮_日期转时间戳.Click() {
var 日期文本 = "2026-05-18 14:30:00"
var 时间对象 = 计时器1.MakeTime(日期文本)
var 毫秒时间戳 = 计时器1.GetMillis(时间对象)
var 秒时间戳 = floor(毫秒时间戳 / 1000)
标签_时间戳.Text = join("时间戳:", 秒时间戳)
}
时间差计算
计算两个时间的差
定义 计算时间差(开始文本, 结束文本) 返回 差值文本
设 开始时间 = 计时器1.从字符串创建时间(开始文本)
设 结束时间 = 计时器1.从字符串创建时间(结束文本)
设 开始毫秒 = 计时器1.获取毫秒数(开始时间)
设 结束毫秒 = 计时器1.获取毫秒数(结束时间)
设 差毫秒 = 结束毫秒 - 开始毫秒
设 天数 = 数学.向下取整(差毫秒 / (1000 * 60 * 60 * 24))
设 剩余 = 差毫秒 模 (1000 * 60 * 60 * 24)
设 小时 = 数学.向下取整(剩余 / (1000 * 60 * 60))
设 剩余 = 剩余 模 (1000 * 60 * 60)
设 分钟 = 数学.向下取整(剩余 / (1000 * 60))
设 秒 = 数学.向下取整((剩余 模 (1000 * 60)) / 1000)
返回 天数 & "天" & 小时 & "小时" & 分钟 & "分" & 秒 & "秒"
计算距今天多少天
定义 距今天数(日期文本) 返回 天数
设 目标日期 = 计时器1.从字符串创建时间(日期文本)
设 今天 = 计时器1.当前时间()
设 差毫秒 = 计时器1.获取毫秒数(目标日期) - 计时器1.获取毫秒数(今天)
返回 数学.向下取整(差毫秒 / (1000 * 60 * 60 * 24))
使用Clock.Duration方法
global 持续时间 = 计时器1.Duration(开始时间, 结束时间)
global 毫秒 = 计时器1.Duration(持续时间)
global 秒 = 计时器1.Duration(持续时间)
global 分钟 = 计时器1.Duration(持续时间)
global 小时 = 计时器1.Duration(持续时间)
global 天数 = 计时器1.Duration(持续时间)
倒计时器
实现倒计时
设 目标时间 = 0
设 剩余毫秒 = 0
当 按钮_开始倒计时.被点击
设 分钟数 = 文本转数字(输入框_分钟.文本)
设 现在 = 计时器1.获取毫秒数(计时器1.当前时间())
设 目标时间 = 现在 + 分钟数 * 60 * 1000
设 计时器1.计时器间隔 = 100
设 计时器1.启用计时器 = true
当 计时器1.计时
设 现在 = 计时器1.获取毫秒数(计时器1.当前时间())
设 剩余 = 目标时间 - 现在
如果 剩余 ≤ 0
标签_倒计时.文本 = "00:00"
设 计时器1.启用计时器 = false
调用 对话框1.显示信息("⏰ 时间到!", "倒计时结束")
否则
设 分 = 数学.向下取整(剩余 / (1000 * 60))
设 秒 = 数学.向下取整((剩余 模 (1000 * 60)) / 1000)
标签_倒计时.文本 = 文本格式("%02d:%02d", 分, 秒)
秒表/计时器
设 开始时间 = 0
设 是否运行 = false
设 已用时间 = 0
当 按钮_开始.被点击
设 是否运行 = true
设 开始时间 = 计时器1.获取毫秒数(计时器1.当前时间()) - 已用时间
设 Clock_秒表.计时器间隔 = 50
设 Clock_秒表.启用计时器 = true
当 按钮_暂停.被点击
设 是否运行 = false
设 Clock_秒表.启用计时器 = false
当 按钮_重置.被点击
设 是否运行 = false
设 已用时间 = 0
设 Clock_秒表.启用计时器 = false
标签_计时.文本 = "00:00.000"
当 Clock_秒表.计时
如果 是否运行
设 现在 = 计时器1.获取毫秒数(计时器1.当前时间())
设 已用时间 = 现在 - 开始时间
设 分 = 数学.向下取整(已用时间 / 60000)
设 秒 = 数学.向下取整((已用时间 模 60000) / 1000)
设 毫秒 = 已用时间 模 1000
标签_计时.文本 = 文本格式("%02d:%02d.%03d", 分, 秒, 毫秒)
Text to Date / Date to Text
Text转Date
global 日期文本 = "2026-05-18"
global 时间对象 = 计时器1.MakeTime(日期文本)
// 也可以指定格式
global 日期文本2 = "05/18/2026"
global 时间对象2 = 计时器1.MakeTime(日期文本2)
提取时间的各个部分
设 时间 = 计时器1.当前时间()
设 年 = 计时器1.年(时间)
设 月 = 计时器1.月(时间)
设 日 = 计时器1.日(时间)
设 时 = 计时器1.时(时间)
设 分 = 计时器1.分(时间)
设 秒 = 计时器1.秒(时间)
设 星期 = 计时器1.星期几(时间) ' 1=周日, 2=周一...7=周六
常见问题
Q1: 计时器1.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没有”获取启动时间”的概念,用 计时器1.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 🐝 整理。
扫码添加客服咨询