如何在Flutter中生成形如2021-09-27T12:22:23.1861335+02:00的时间格式
在Flutter中生成指定格式的时间字符串
你需要生成的是带7位小数秒和时区偏移的ISO 8601格式时间字符串,Dart的DateTime类默认方法无法直接输出这种格式,以下是两种实现方式:
方法一:手动拼接字符串
无需额外依赖,直接通过DateTime的属性拼接出目标格式:
String generateCustomTime() { DateTime now = DateTime.now(); // 拼接日期部分(yyyy-MM-dd) String dateSegment = '${now.year}-${now.month.toString().padLeft(2, '0')}-${now.day.toString().padLeft(2, '0')}'; // 拼接时间时分秒部分(HH:mm:ss) String timeSegment = '${now.hour.toString().padLeft(2, '0')}:${now.minute.toString().padLeft(2, '0')}:${now.second.toString().padLeft(2, '0')}'; // 处理7位小数秒(取微秒补零到7位) int microseconds = now.microsecondsSinceEpoch.remainder(1000000); String fractionalSegment = microseconds.toString().padLeft(6, '0') + '0'; // 处理时区偏移(±HH:mm格式) Duration offset = now.timeZoneOffset; String offsetSign = offset.isNegative ? '-' : '+'; int offsetHours = offset.inHours.abs(); int offsetMinutes = offset.inMinutes.abs() % 60; String offsetSegment = '$offsetSign${offsetHours.toString().padLeft(2, '0')}:${offsetMinutes.toString().padLeft(2, '0')}'; // 拼接所有部分 return '$dateSegmentT$timeSegment.$fractionalSegment$offsetSegment'; } // 使用示例 void main() { print(generateCustomTime()); // 输出类似 2021-09-27T12:22:23.1861335+02:00 }
方法二:使用intl包辅助格式化
借助intl包简化日期时间的基础格式化,再补充微秒和时区部分:
- 先在
pubspec.yaml中添加依赖:
dependencies: flutter: sdk: flutter intl: ^0.19.0 # 可替换为最新版本
- 实现格式化函数:
import 'package:intl/intl.dart'; String formatTargetDateTime(DateTime dateTime) { // 用intl格式化基础的日期时间到秒 String baseFormat = DateFormat('yyyy-MM-ddTHH:mm:ss').format(dateTime); // 生成7位小数秒 int micros = dateTime.microsecondsSinceEpoch.remainder(1000000); String fractionalPart = micros.toString().padLeft(6, '0') + '0'; // 生成时区偏移字符串 Duration offset = dateTime.timeZoneOffset; String sign = offset.isNegative ? '-' : '+'; int hours = offset.inHours.abs(); int minutes = offset.inMinutes.abs() % 60; String offsetStr = '$sign${hours.toString().padLeft(2, '0')}:${minutes.toString().padLeft(2, '0')}'; return '$baseFormat.$fractionalPart$offsetStr'; } // 使用示例 void main() { print(formatTargetDateTime(DateTime.now())); }
说明
- 示例中7位小数秒是通过微秒(6位)补一个零实现的,如果你需要更精确的数值(比如模拟纳秒),可以根据需求调整补位逻辑。
- 如果需要生成指定时区(而非本地时区)的时间,可以先用
DateTime.utc()创建UTC时间,再手动添加对应的时区偏移量。
内容的提问来源于stack exchange,提问作者marwan steam
相关产品推荐
相关产品推荐

