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(秒时间戳))
}

时间戳转日期

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-18
  • MM/dd/yyyy → 05/18/2026
  • yyyy-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等
文档反馈