一、申明

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

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐