概述
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(秒时间戳))
}
时间戳转日期
when 按钮_时间戳转日期.Click() {
var 输入时间戳 = 输入框_时间戳.Text
var 毫秒 = 输入时间戳 * 1000
var 时间对象 = 计时器1.MakeInstantFromMillis(毫秒)
标签_日期.Text = 计时器1.FormatDateTime(时间对象, "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("时间戳:", 秒时间戳)
}
时间差计算
计算两个时间的差
function 计算时间差(开始文本, 结束文本) {
var 开始时间 = 计时器1.MakeInstant(开始文本)
var 结束时间 = 计时器1.MakeInstant(结束文本)
var 开始毫秒 = 计时器1.GetMillis(开始时间)
var 结束毫秒 = 计时器1.GetMillis(结束时间)
var 差毫秒 = 结束毫秒 - 开始毫秒
var 天数 = floor(差毫秒 / (1000 * 60 * 60 * 24))
var 剩余 = 差毫秒 % (1000 * 60 * 60 * 24)
var 小时 = floor(剩余 / (1000 * 60 * 60))
剩余 = 剩余 % (1000 * 60 * 60)
var 分钟 = floor(剩余 / (1000 * 60))
var 秒 = floor((剩余 % (1000 * 60)) / 1000)
return join(天数, "天", 小时, "小时", 分钟, "分", 秒, "秒")
}
计算距今天多少天
function 距今天数(日期文本) {
var 目标日期 = 计时器1.MakeInstant(日期文本)
var 今天 = 计时器1.Now()
var 差毫秒 = 计时器1.GetMillis(目标日期) - 计时器1.GetMillis(今天)
return floor(差毫秒 / (1000 * 60 * 60 * 24))
}
使用Clock.Duration方法
global 持续时间 = 计时器1.Duration(开始时间, 结束时间)
global 毫秒 = 计时器1.Duration(持续时间)
global 秒 = 计时器1.Duration(持续时间)
global 分钟 = 计时器1.Duration(持续时间)
global 小时 = 计时器1.Duration(持续时间)
global 天数 = 计时器1.Duration(持续时间)
倒计时器
实现倒计时
global 目标时间 = 0
global 剩余毫秒 = 0
when 按钮_开始倒计时.Click() {
var 分钟数 = 输入框_分钟.Text
var 现在 = 计时器1.GetMillis(计时器1.Now())
目标时间 = 现在 + 分钟数 * 60 * 1000
计时器1.TimerInterval = 100
计时器1.TimerEnabled = true
}
when 计时器1.Timer() {
var 现在 = 计时器1.GetMillis(计时器1.Now())
var 剩余 = 目标时间 - 现在
if (剩余 <= 0) {
标签_倒计时.Text = "00:00"
计时器1.TimerEnabled = false
对话框1.ShowAlert("⏰ 时间到!")
} else {
var 分 = floor(剩余 / (1000 * 60))
var 秒 = floor((剩余 % (1000 * 60)) / 1000)
标签_倒计时.Text = join(分, ":", 秒)
}
}
秒表/计时器
global 开始时间 = 0
global 是否运行 = false
global 已用时间 = 0
when 按钮_开始.Click() {
是否运行 = true
开始时间 = 计时器1.GetMillis(计时器1.Now()) - 已用时间
Clock_秒表.TimerInterval = 50
Clock_秒表.TimerEnabled = true
}
when 按钮_暂停.Click() {
是否运行 = false
Clock_秒表.TimerEnabled = false
}
when 按钮_重置.Click() {
是否运行 = false
已用时间 = 0
Clock_秒表.TimerEnabled = false
标签_计时.Text = "00:00.000"
}
when Clock_秒表.Timer() {
if (是否运行) {
var 现在 = 计时器1.GetMillis(计时器1.Now())
已用时间 = 现在 - 开始时间
var 分 = floor(已用时间 / 60000)
var 秒 = floor((已用时间 % 60000) / 1000)
var 毫秒 = 已用时间 % 1000
标签_计时.Text = join(分, ":", 秒, ".", 毫秒)
}
}
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)
提取时间的各个部分
global 时间 = 计时器1.Now()
global 年 = 计时器1.Year(时间)
global 月 = 计时器1.Month(时间)
global 日 = 计时器1.DayOfMonth(时间)
global 时 = 计时器1.Hour(时间)
global 分 = 计时器1.Minute(时间)
global 秒 = 计时器1.Second(时间)
global 星期 = 计时器1.Weekday(时间) // 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等 |
扫码添加客服咨询