App Inventor 2 时间戳转换教程

本教程讲解时间戳与日期格式的相互转换,包括Unix时间戳、日期格式化、时区处理、倒计时实现等。

一、基础知识

1.1 时间戳概念

类型格式示例
Unix时间戳1711766400
Unix时间戳毫秒1711766400000
ISO格式YYYY-MM-DD2024-03-30
时间格式HH:mm:ss12:00:00

1.2 时间组件

┌─────────────────────────────────────┐
│         日期时间对象                  │
├──────────┬──────────┬───────────────┤
│  年/月/日 │  时:分:秒 │  毫秒/时区     │
└──────────┴──────────┴───────────────┘

二、App Inventor内置方法

2.1 获取当前时间

当 Screen1.初始化 时
  // 获取当前时间戳(毫秒)
  设置 全局变量 当前时间戳 = 调用 时钟1.获取时间毫秒()
  
  // 获取当前日期
  设置 全局变量 当前日期 = 调用 时钟1.获取日期()
  
  // 获取当前时间
  设置 全局变量 当前时间 = 调用 时钟1.获取时间()
  
  显示当前时间()

过程 显示当前时间
  设置 Label_Timestamp.文本 = "时间戳: " + 当前时间戳
  设置 Label_Date.文本 = "日期: " + 当前日期
  设置 Label_Time.文本 = "时间: " + 当前时间

2.2 时间戳转日期

过程 时间戳转日期(时间戳)
  设置 全局变量 日期对象 = 创建空字典()
  
  // 转换为秒(如果传入毫秒)
  设置 全局变量 秒 = 向下取整(时间戳 / 1000)
  
  // 基础日期:1970-01-01 00:00:00
  设置 全局变量 天数 = 向下取整(全局变量 秒 / 86400)
  
  // 计算年
  设置 全局变量 年 = 1970 + 向下取整(全局变量 天数 / 365.25)
  
  // 计算剩余天数
  设置 全局变量 剩余天数 = 全局变量 天数 - 向下取整((全局变量 年 - 1970) * 365.25)
  
  // 计算月日(简化版)
  设置 全局变量 月 = 向下取整(全局变量 剩余天数 / 30) + 1
  设置 全局变量 日 = 剩余天数 - 向下取整((全局变量 月 - 1) * 30) + 1
  
  // 限制范围
  如果 全局变量 月 > 12 则
    设置 全局变量 月 = 12
  如果结束
  
  返回 全局变量 年 + "-" + 补零(全局变量 月) + "-" + 补零(全局变量 日)
过程结束

过程 补零(数字)
  如果 数字 < 10 则
    返回 "0" + 数字
  否则
    返回 "" + 数字
  如果结束
过程结束

2.3 日期转时间戳

过程 日期转时间戳(年, 月, 日)
  // 计算从1970到目标日期的天数
  设置 全局变量 总天数 = (年 - 1970) * 365
  
  // 加上闰年
  对于 i 从 1970 到 年 - 1
    如果 (i mod 4 = 0 且 i mod 100 ≠ 0) 或 (i mod 400 = 0) 则
      设置 全局变量 总天数 = 全局变量 总天数 + 1
    如果结束
  循环结束
  
  // 加上当年已过天数
  设置 全局变量 月天数 = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
  如果 (年 mod 4 = 0 且 年 mod 100 ≠ 0) 或 (年 mod 400 = 0) 则
    设置 全局变量 月天数 = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
  如果结束
  
  对于 i 从 1 到 月 - 1
    设置 全局变量 总天数 = 全局变量 总天数 + 获取列表项目(全局变量 月天数, i)
  循环结束
  
  设置 全局变量 总天数 = 全局变量 总天数 + 日 - 1
  
  // 转换为毫秒
  返回 全局变量 总天数 * 86400 * 1000
过程结束

三、实用案例

3.1 倒计时功能

初始化全局变量 目标时间戳 = 0
初始化全局变量 剩余秒数 = 0

当 Button_SetCountdown.被点击 时
  // 设置倒计时目标(例如:30分钟后)
  设置 全局变量 目标时间戳 = 调用 时钟1.获取时间毫秒() + 30 * 60 * 1000
  设置 全局变量 剩余秒数 = 30 * 60
  
  // 开启定时器
  调用 时钟1.开启定时器(间隔: 1000)
  
  设置 Label_Status.文本 = "倒计时开始"

当 时钟1.计时 时
  设置 全局变量 当前时间戳 = 调用 时钟1.获取时间毫秒()
  
  如果 全局变量 当前时间戳 ≥ 全局变量 目标时间戳 则
    // 倒计时结束
    调用 时钟1.关闭定时器()
    设置 Label_Countdown.文本 = "00:00:00"
    调用 Notifier1.显示消息("倒计时结束!")
  否则
    // 计算剩余时间
    设置 全局变量 剩余毫秒 = 全局变量 目标时间戳 - 全局变量 当前时间戳
    设置 全局变量 剩余秒数 = 向下取整(全局变量 剩余毫秒 / 1000)
    
    调用 显示倒计时格式(全局变量 剩余秒数)
  如果结束

过程 显示倒计时格式(总秒数)
  设置 全局变量 小时 = 向下取整(总秒数 / 3600)
  设置 全局变量 分钟 = 向下取整((总秒数 mod 3600) / 60)
  设置 全局变量 秒 = 总秒数 mod 60
  
  设置 全局变量 格式 = 
    补零(全局变量 小时) + ":" + 
    补零(全局变量 分钟) + ":" + 
    补零(全局变量 秒)
  
  设置 Label_Countdown.文本 = 全局变量 格式
过程结束

3.2 秒杀倒计时(服务器时间同步)

初始化全局变量 服务器时间偏移 = 0

当 Screen1.初始化 时
  // 获取服务器时间并计算偏移
  调用 同步服务器时间()

过程 同步服务器时间
  // 发送请求到服务器获取当前时间戳
  调用 Web1.发送文本请求(
    网址: "http://your-server.com/time.php",
    方法: "GET"
  )

当 Web1.收到文本响应(响应文本) 时
  设置 全局变量 服务器时间戳 = 文本转数字(响应文本)
  设置 全局变量 本地时间戳 = 调用 时钟1.获取时间毫秒()
  设置 全局变量 服务器时间偏移 = 全局变量 服务器时间戳 - 本地时间戳
  
  调用 Notifier1.显示消息("时间同步完成")

过程 获取准确当前时间
  返回 调用 时钟1.获取时间毫秒() + 全局变量 服务器时间偏移
过程结束

// 秒杀倒计时
当 Button_Seckill.被点击 时
  // 秒杀开始时间(服务器时间)
  设置 全局变量 秒杀开始时间 = 1711766400000  // 示例时间戳
  
  调用 时钟1.开启定时器(间隔: 100)

3.3 日期加减计算

过程 日期加天数(基准日期, 加天数)
  // 基准日期格式:YYYY-MM-DD
  设置 全局变量 部分 = 文本分割(基准日期, "-")
  设置 全局变量 年 = 文本转数字(获取列表项目(全局变量 部分, 1))
  设置 全局变量 月 = 文本转数字(获取列表项目(全局变量 部分, 2))
  设置 全局变量 日 = 文本转数字(获取列表项目(全局变量 部分, 3))
  
  // 转为时间戳,加天数,再转回
  设置 全局变量 时间戳 = 调用 日期转时间戳(全局变量 年, 全局变量 月, 全局变量 日)
  设置 全局变量 新时间戳 = 全局变量 时间戳 + 加天数 * 86400 * 1000
  
  返回 调用 时间戳转日期(全局变量 新时间戳)
过程结束

当 Button_Calc.被点击 时
  设置 全局变量 原日期 = TextBox_Date.文本
  设置 全局变量 加天数 = 文本转数字(TextBox_Days.文本)
  
  设置 全局变量 新日期 = 调用 日期加天数(全局变量 原日期, 全局变量 加天数)
  设置 Label_Result.文本 = "结果: " + 全局变量 新日期

3.4 显示相对时间(刚刚、分钟前、小时前)

过程 显示相对时间(时间戳)
  设置 全局变量 当前时间 = 调用 时钟1.获取时间毫秒()
  设置 全局变量 差值 = 全局变量 当前时间 - 时间戳
  
  设置 全局变量 秒 = 向下取整(差值 / 1000)
  
  如果 全局变量 秒 < 60 则
    返回 "刚刚"
  否则
    设置 全局变量 分 = 向下取整(全局变量 秒 / 60)
    
    如果 全局变量 分 < 60 则
      返回 全局变量 分 + "分钟前"
    否则
      设置 全局变量 时 = 向下取整(全局变量 分 / 60)
      
      如果 全局变量 时 < 24 则
        返回 全局变量 时 + "小时前"
      否则
        设置 全局变量 天 = 向下取整(全局变量 时 / 24)
        
        如果 全局变量 天 < 30 则
          返回 全局变量 天 + "天前"
        否则
          返回 调用 时间戳转日期(时间戳)
        如果结束
      如果结束
    如果结束
  如果结束
过程结束

四、与服务器时间同步

4.1 PHP服务器端

<?php
// time.php - 返回当前Unix时间戳(秒)
header('Content-Type: text/plain');
echo time();
?>

4.2 同步代码

当 Button_SyncTime.被点击 时
  调用 Notifier1.显示消息("正在同步时间...")
  调用 Web1.发送文本请求(网址: "http://your-server.com/time.php")

当 Web1.收到文本响应(响应文本) 时
  设置 全局变量 服务器时间 = 文本转数字(响应文本) * 1000  // 转毫秒
  设置 全局变量 本地时间 = 调用 时钟1.获取时间毫秒()
  设置 全局变量 时间偏移 = 全局变量 服务器时间 - 全局变量 本地时间
  
  调用 Notifier1.显示消息("同步完成,偏移: " + 全局变量 时间偏移 + "ms")

五、常见问题

5.1 时区问题

问题:显示时间与预期差8小时
原因:服务器时区与本地不一致
解决:统一使用UTC或添加时区偏移
设置 全局变量 中国时区偏移 = 8 * 60 * 60 * 1000  // 毫秒
设置 全局变量 本地时间 = 调用 时钟1.获取时间毫秒() + 全局变量 中国时区偏移

5.2 闰年问题

问题:跨年日期计算不准确
解决:使用标准库或简化算法

5.3 毫秒/秒混淆

问题:时间戳数值差1000倍
解决:确认单位统一,毫秒转秒除以1000

六、总结

功能方法示例
获取当前时间戳时钟1.获取时间毫秒()1711766400000
获取当前日期时钟1.获取日期()2024/3/30
格式化显示自定义过程00:30:00
日期加减时间戳运算+7天
相对时间条件判断3小时前

教程作者:ai2claw 🐝
创建时间:2026-03-30
适用版本:App Inventor 2

参考资料与版权声明

原文来源

版权声明

本文档基于 MIT App Inventor 官方文档及社区资源整理,版权归原作者所有:
  • MIT App Inventor 官方文档采用 CC BY-SA 4.0 授权
  • MIT App Inventor Community 帖子版权归原作者所有
本文档由 ai2claw 🐝 整理,仅供学习参考,如有侵权请联系删除。