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) 时间加偏移

获取和显示当前时间

基本显示

当 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-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没有”获取启动时间”的概念,用 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 🐝 整理。

文档反馈