01-6.基础类型-日期时间DateTime
一、申明
print(DateTime.now());//当前时间
print(DateTime(2026,01,26,15,16,30));//指定时间
2026-01-26 15:16:07.103416
2026-01-26 15:16:30.000
二、UTC时间
1.什么是UTC?
UTC(Coordinated Universal Time,协调世界时) 是全球时间的通用标准。在编程中,理解和处理 UTC 是至关重要的,尤其是在处理服务器通讯、日志记录和多时区应用时。
-
全球基准:它不属于任何时区,是全球统一的时间参考。
-
0 时区:UTC 相当于英国伦敦(格林威治)的时间,但不随夏令时改变。
-
表示方式:通常在时间字符串末尾加一个 Z(代表 Zulu,零时区),例如:2023-10-27T10:30:00Z。

2.UTC的使用
(1).本地时间与 UTC 的转换
//本地区当前时间
var now=DateTime.now();
print(now);
//本地区当前时间对应的UTC时间
var nowUtc=DateTime.now().toUtc();
print(nowUtc);
//UTC时间对应的本地区时间
var nowLocal=DateTime.now().toUtc().toLocal();
print(nowLocal);
(2).检查是否为 UTC
DateTime time = DateTime.now();
if (time.isUtc) {
print("这是 UTC 时间");
} else {
print("这是本地时间");
}
(3).ISO 8601 标准格式化
API 通讯中,最标准的 UTC 格式是 2023-10-27T08:00:00.000Z。
中间是用 T 分隔日期和时间的(这是 ISO 8601 标准的强制要求)。
var nowUtc=DateTime.now().toUtc();
print(nowUtc);
print(nowUtc.toIso8601String() );
2026-01-26 07:47:37.199210Z
2026-01-26T07:47:37.199210Z
存储与传输:永远使用 toUtc().toIso8601String() 发送给后端。
为什么要用 .toIso8601String()?
-
A. 标准化(机器阅读)
ISO 8601 是国际标准化组织规定的时间格式。绝大多数编程语言(Java, Python, JS, Go)和数据库(PostgreSQL, MongoDB)都能完美识别带 T 的字符串并将其解析回时间对象。
如果你把带“空格”的 toString() 传给某些严格的 API,它们可能会报错“格式不合法”。
-
B. 跨平台兼容性
在 Web 开发或 App 与服务器通讯时,JSON 是主要的数据格式。JSON 不支持 DateTime 类型,只能传字符串。 .toIso8601String() 是传给后端的“通用通行证”。
-
C. 避免本地化干扰
toString() 的初衷是给人看的(Human-readable),而 toIso8601String() 是给机器看的(Machine-readable)。
(4).实际使用
1).接收数据
String time='2023-08-10 12:00:00.000Z';
//1.先解析时间:
//如果服务器返回的是标准的 ISO 8601 格式(带 T,末尾带 Z 或时区偏移),直接使用 DateTime.parse()
var dateTime=DateTime.parse(time);
//如果服务器返回 2023-10-27 02:30:00 但没带 Z,Dart 会默认将其识别为本地时间, 手动补上 Z 再解析,或者解析后强制指定
//var dateTime=DateTime.parse(time+'z');
print(dateTime);
//2.转换为本地时间
var localTime=dateTime.toLocal();
print(localTime);
//3.显示本地时间(格式化)
//命令行执行 dart pub add intl
//在代码顶部增加 import 'package:intl/intl.dart';
// 常见格式化示例
String day = DateFormat('yyyy-MM-dd').format(localTime); // 2023-10-27
String time = DateFormat('HH:mm').format(localTime); // 10:30
String full = DateFormat('yyyy年MM月dd日 HH:mm').format(localTime); // 2023年10月27日 10:30
2).发送数据
//1.先得到当前时间
var dateTime=DateTime.now();
///方式1:2-1.直接转换为UTC时间
var utcTime=dateTime.toUtc();
// 发送的数据格式:2023-10-27T02:30:00.123456Z
// 后端的 Z 会告诉服务器:“这是 UTC,请按零时区处理”。
String body=utcTime.toIso8601String();
print(body);
///方式2:2-2.带偏移量的本地时间
String base=dateTime.toIso8601String();
Duration offset = dateTime.timeZoneOffset;
String sign = offset.isNegative ? "-" : "+";
// 取绝对值并补零,确保格式为 HH:mm
String hh = offset.inHours.abs().toString().padLeft(2, '0');
String mm = (offset.inMinutes.abs() % 60).toString().padLeft(2, '0');
String body2="$base$sign$hh:$mm";
print(body2);
2026-01-26T08:34:46.795010Z
2026-01-26T16:34:46.795010+08:00
发送数据中的方式1和方式2,得到的字符串指向的是宇宙中同一个瞬间;
但是:方式2会告诉服务器,发送者的所处时区。
三、时间增减量
var d1 = DateTime.now();
print(d1);
print(d1.add(new Duration(minutes: 5)));
print(d1.add(new Duration(minutes: -5)));
2022-05-28 22:09:12.805
2022-05-28 22:14:12.805
2022-05-28 22:04:12.805
四、比较时间
var d1 = new DateTime(2018, 10, 1);
var d2 = new DateTime(2018, 10, 10);
print(d1.isAfter(d2));
print(d1.isBefore(d2));
false
true
var d1 = DateTime.now();
var d2 = d1.add(new Duration(milliseconds: 30));
print(d1.isAtSameMomentAs(d2));
false
五、时间差
var d1 = new DateTime(2018, 10, 1);
var d2 = new DateTime(2018, 10, 10);
var difference = d1.difference(d2);
print([difference.inDays, difference.inHours]);
[-9, -216]
六、时间戳
var now = new DateTime.now();
print(now.millisecondsSinceEpoch);
print(now.microsecondsSinceEpoch);
1653747090687
1653747090687000
更多推荐
所有评论(0)