ChatGPT解决这个技术问题 Extra ChatGPT

如何在 Flutter 中格式化日期时间

我试图在点击按钮后在 Text 小部件中显示当前的 DateTime。以下工作,但我想改变格式。

目前的方法

DateTime now = DateTime.now();
currentTime = new DateTime(now.year, now.month, now.day, now.hour, now.minute);
 Text('$currentTime'), 

结果

YYYY-MM-JJ HH-MM:00.000

问题

如何删除 :00.000 部分?


T
TheMisir

您可以使用 intl 包中的 DateFormat

import 'package:intl/intl.dart';

DateTime now = DateTime.now();
String formattedDate = DateFormat('yyyy-MM-dd – kk:mm').format(now);

不要忘记将 intl: 0.15.7 依赖项添加到您的 pubspec.yaml 文件中。可以在 here 中找到该库的最新版本。
其他任何人都无法在初始化程序中访问该静态成员?
@MrPool 是的,在初始化程序中无法访问静态成员的相同问题。非常令人沮丧,因为将日期设为静态是没有意义的。
如果您想使用特定的语言环境,您可以使用例如:DateFormat.yMd(myLocale.languageCode).format(now) 获取当前设备语言环境,如下所示:Locale myLocale = Localizations.localeOf(context)
C
CopsOnRoad

intl package 添加到您的 pubspec.yaml 文件中。

import 'package:intl/intl.dart';

DateFormat dateFormat = DateFormat("yyyy-MM-dd HH:mm:ss");

将 DateTime 对象转换为字符串

String string = dateFormat.format(DateTime.now());

将字符串转换为 DateTime 对象

DateTime dateTime = dateFormat.parse("2019-07-19 8:40:23");

Q
Quick learner

使用这种方法,无需导入任何库。

DateTime now = DateTime.now();

String convertedDateTime = "${now.year.toString()}-${now.month.toString().padLeft(2,'0')}-${now.day.toString().padLeft(2,'0')} ${now.hour.toString().padLeft(2,'0')}-${now.minute.toString().padLeft(2,'0')}";

输出

2020-12-05 14:57


除了缺少的破折号之外,这是不添加另一个依赖项的最佳方法。
这很好,但小时是在 24 小时时钟上返回非美国标准时间。算术……唉……算了,我去拿包
@funder7 - 您添加的每个外部依赖项都是代码库中的潜在故障点。依赖关系由第 3 方维护 - 因此您绝对无法保证每次迭代(即版本更改)时此第 3 方代码的功能和稳定性。因此,在生产代码中尽可能少的依赖是明智的。
是的,这可能是真的,但如果你害怕回归,你可以坚持使用固定版本。开发外部库的用户通常会提供很好的代码:考虑上面的代码片段:它以预期的格式返回日期,但在我看来,这很丑陋,因为 Flutter 具有很好地处理日期/时间国际化的 intl 库。它是经过测试的代码,可能比使用 cut'n'paste 得到的要好得多。显然我不会为字符串连接导入外部库..但我认为你明白了我的意思。干杯;)
这是不添加软件包的理想选择。唯一的问题是我认为您还需要将 padLeft(2,'0') 添加到分钟字段,否则 14:07 将显示为 14:7
z
zizutg

这是我的简单解决方案。这不需要任何依赖。

但是,日期将采用字符串格式。如果您想要时间,请更改子字符串值

print(new DateTime.now()
            .toString()
            .substring(0,10)
     );   // 2020-06-10

这在没有任何包装的情况下效果很好。下面是实现的方法。现在日期时间 = DateTime.now(); DateTime date = new DateTime(now.year, now.month, now.day); print(date.toString().substring(0, 10) );
A
Andre Hendrawan

试试这个包 Jiffy,它也在 Intl 之上运行,但使用 momentjs 语法更容易。见下文

import 'package:jiffy/jiffy.dart';   

var now = Jiffy().format("yyyy-MM-dd HH:mm:ss");

您还可以执行以下操作

var a = Jiffy().yMMMMd; // October 18, 2019

你也可以传入你的 DateTime 对象,一个字符串和一个数组

var a = Jiffy(DateTime(2019, 10, 18)).yMMMMd; // October 18, 2019

var a = Jiffy("2019-10-18").yMMMMd; // October 18, 2019

var a = Jiffy([2019, 10, 18]).yMMMMd; // October 18, 2019

S
SilenceCodder

使用此功能

todayDate() {
    var now = new DateTime.now();
    var formatter = new DateFormat('dd-MM-yyyy');
    String formattedTime = DateFormat('kk:mm:a').format(now);
    String formattedDate = formatter.format(now);
    print(formattedTime);
    print(formattedDate);
  }

输出:

08:41:AM
21-12-2019

a
asli

自 0.16 以来发生了一些变化,所以我是怎么做的,

在 pubspec.yaml 中导入

dependencies:
      flutter:
        sdk: flutter
      intl: ^0.16.1

然后使用

  txdate= DateTime.now()


  DateFormat.yMMMd().format(txdate)

J
Jean Carlos

您也可以使用此语法。对于 YYYY-MM-JJ HH-MM:

var now = DateTime.now();
var month = now.month.toString().padLeft(2, '0');
var day = now.day.toString().padLeft(2, '0');
var text = '${now.year}-$month-$day ${now.hour}:${now.minute}';

这不会为真正的“yyyy-MM-dd”添加正确的填充
E
Etienne Kaiser

DateTime.now() 已弃用,请改用 clock.now()

import 'package:clock/clock.dart';

DateTime now = clock.now();
String formattedDate = DateFormat('yyyy-MM-dd – kk:mm').format(now);

N
Nazarii Boichyshyn

如果用户是美国公民,但希望以 24 小时格式查看所有内容 - 那么显示基于区域设置的 12/24 小时将不会满足用户

 // getting system settings 12/24 h format
      if (MediaQuery.of(context).alwaysUse24HourFormat){
        timeFormat = new DateFormat("kk:mm", languageCode); //24h format
      }
      else{
        timeFormat = new DateFormat("KK:mm a", languageCode); //12h format
      }
//then use it:
 '${timeFormat.format DateTime.now())}'

请注意,如果您想以 12 小时格式查看 12:00 点(24 小时格式)为 12:00 而不是 00:00,请使用“hh”和“HH”而不是“kk”和“KK”` h 小时in am/pm (1~12) (Number) H 小时 in day (0~23) (Number) k 小时 in day (1~24) (Number) K 小时 in am/pm (0~11) (Number) `
M
Mohd Danish Khan

使用字符串拆分方法删除:00.000

var formatedTime = currentTime.toString().split(':')
Text(formatedTime[0])

======= 或使用以下代码用于 YYYY-MM-DD HH:MM:SS 格式而不使用库 ====

var stringList =  DateTime.now().toIso8601String().split(new RegExp(r"[T\.]"));
var formatedDate = "${stringList[0]} ${stringList[1]}";

也可以删除秒?谢谢
R
Rahul Baghaniya
static String convertDateFormat(String dateTimeString, String oldFormat, String 
           newFormat) {
        DateFormat newDateFormat = DateFormat(newFormat);
        DateTime dateTime = DateFormat(oldFormat).parse(dateTimeString);
        String selectedDate = newDateFormat.format(dateTime);
        return selectedDate;
            }

以这种方式调用此方法

 convertDateFormat(inputDate, "dd-mm-yyyy", "d MMM yyyy");

M
Mohammad Bilal

你不能在 dart 中格式化日期,所以你需要使用外部包,我推荐这篇文章:https://www.geeksforgeeks.org/format-dates-in-flutter/


请在您的回答中提供更多详细信息。正如目前所写的那样,很难理解您的解决方案。
J
Jeppe

DateTime简单 扩展方法怎么样。运行时可能不是很好,因为我们多次迭代字符串并迭代每个 % 格式选项。可能会遍历一次并贪婪地替换 %

extension DateTimeFormat on DateTime {

  /// Supports the following, inspired by: https://linux.die.net/man/3/strptime
  /// %Y: The year, including century (for example, 1991).
  /// %m: The month number (1-12).
  /// %d: The day of month (1-31).
  /// %H: The hour (0-23).
  /// %M: The minute (0-59).
  /// %S: The second (0-59).
  String format(String formatString) {
    var hourString = hour.toString();
    var dayString = day.toString();
    var monthString = month.toString();
    var minuteString = minute.toString();
    var secondString = second.toString();
    var yearString = year.toString();

    var map = {
      '%H': hourString.padLeft(3 - hourString.length, '0'), // the pad values here are the desired length + 1
      '%d': dayString.padLeft(3 - dayString.length, '0'),
      '%m': monthString.padLeft(3 - monthString.length, '0'),
      '%M': minuteString.padLeft(3 - minuteString.length, '0'),
      '%S': secondString.padLeft(3 - secondString.length, '0'),
      '%Y': yearString.padLeft(5 - yearString.length, '0'),
    };
    return map.entries.fold(formatString, (acc, entry) => acc.replaceAll(entry.key, entry.value));
  }
}

用法:

print(DateTime(2021, 10, 16, 4, 4, 4, 4, 4).format('%Y-%m-%d-%H-%M-%S'));
// '2021-10-16-04-04-04'

随时提出更改建议。


A
Anandh Krishnan

转换 sting int Dateformat 的最好和最简单的方法是,

  print(DateTime.parse('2020-01-02')); // 2020-01-02 00:00:00.000
  print(DateTime.parse('20200102')); // 2020-01-02 00:00:00.000
  print(DateTime.parse('-12345-03-04')); // -12345-03-04 00:00:00.000
  print(DateTime.parse('2020-01-02 07')); // 2020-01-02 07:00:00.000
  print(DateTime.parse('2020-01-02T07')); // 2020-01-02 07:00:00.000
  print(DateTime.parse('2020-01-02T07:12')); // 2020-01-02 07:12:00.000
  print(DateTime.parse('2020-01-02T07:12:50')); // 2020-01-02 07:12:50.000
  print(DateTime.parse('2020-01-02T07:12:50Z')); // 2020-01-02 07:12:50.000Z
  print(DateTime.parse('2020-01-02T07:12:50+07')); // 2020-01-02 00:12:50.000Z
  print(DateTime.parse('2020-01-02T07:12:50+0700')); // 2020-01-02 00:12:50.00
  print(DateTime.parse('2020-01-02T07:12:50+07:00')); // 2020-01-02 00:12:50.00