App Inventor 2 时间处理教程 - 时间戳转换、格式化与计算

« 返回首页

概述

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-dd2026-05-18
  • MM/dd/yyyy05/18/2026
  • yyyy-MM-ddTHH:mm:ss2026-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 🐝 整理。

文档反馈