You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter:如何将指定格式日期字符串转为DateTime类型?

解决Dart中格式化DateTime字符串后无法转回DateTime的问题

核心问题

你当前的格式化代码把UTC+5作为固定文本硬编码在模板里,解析时如果不匹配完全一致的模板、或者没指定正确的Locale(因为用了英文月份全称),就会解析失败。另外硬编码时区文本会导致DateFormat无法自动识别时区偏移,需要额外处理。

方案1:完全匹配模板解析(保留原格式化字符串格式)

直接使用和格式化时完全一致的模板,同时指定英文Locale(确保月份全称能被正确识别):

import 'package:intl/intl.dart';

void main() {
  // 原格式化代码
  String formattedDate = DateFormat(
    "MMMM dd, yyyy 'at' hh:mm:ss a 'UTC+5'",
    'en_US' // 指定英文Locale,避免月份解析失败
  ).format(DateTime.now().toUtc().add(Duration(hours: 5)));

  // 解析代码
  try {
    DateTime parsedDate = DateFormat(
      "MMMM dd, yyyy 'at' hh:mm:ss a 'UTC+5'",
      'en_US'
    ).parse(formattedDate);
    
    // 注意:解析出的DateTime默认是本地时区,需转换为UTC+5对应的时间点
    // 你格式化的是UTC时间+5小时,所以解析后要转回UTC时间(减5小时)
    DateTime utcDate = parsedDate.subtract(Duration(hours: 5));
    print(utcDate.toIso8601String());
  } catch (e) {
    print("解析失败:$e");
  }
}

方案2:使用时区格式符(更规范,推荐)

把硬编码的UTC+5换成时区偏移格式符Z,这样格式化和解析时都能自动处理时区信息,避免手动调整:

import 'package:intl/intl.dart';

void main() {
  // 格式化:生成带标准时区偏移的字符串(如"March 19, 2024 at 11:06:32 AM UTC+0500")
  String formattedDate = DateFormat(
    "MMMM dd, yyyy 'at' hh:mm:ss a 'UTC'Z",
    'en_US'
  ).format(DateTime.now().toUtc().add(Duration(hours: 5)));

  // 解析:自动识别时区偏移,直接得到正确的时间点
  DateTime parsedDate = DateFormat(
    "MMMM dd, yyyy 'at' hh:mm:ss a 'UTC'Z",
    'en_US'
  ).parse(formattedDate);
  
  print(parsedDate.toIso8601String());
}

关键注意点

  • Locale必须匹配:因为用了英文月份全称(MMMM),如果默认Locale不是英文,解析会报错,所以一定要指定en_US。
  • 时区处理:Dart的DateTime对象本身不存储时区信息,仅通过isUtc标记是否为UTC时间。如果要表示UTC+5的时间,建议存储对应的UTC时间,显示时再转换为UTC+5格式。

内容的提问来源于stack exchange,提问作者Anees Dahot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 10:17:49