Как отформатировать DateTime во Flutter

104

Я пытаюсь отобразить текущее значение DateTimeв Textвиджете после нажатия кнопки. Следующее работает, но я бы хотел изменить формат.

Текущий подход

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деталь?

Нитнеук
источник

Ответы:

228

Вы можете использовать DateFormatиз пакета intl .

import 'package:intl/intl.dart';

DateTime now = DateTime.now();
String formattedDate = DateFormat('yyyy-MM-dd – kk:mm').format(now);
боформер
источник
50
Не забудьте добавить intl: 0.15.7зависимость к вашему pubspec.yamlфайлу. Последнюю версию библиотеки можно найти здесь .
Defuera 03
У пакета intl очень низкие рейтинги
Aseem
Кому-нибудь еще, что статические члены не могут быть доступны в инициализаторах?
MrPool
@MrPool Да, та же проблема со статическими членами недоступна в инициализаторах. Очень неприятно, потому что статическая дата не имеет смысла.
Майкл Толсма,
2
Если вы хотите использовать конкретный языковой стандарт, вы можете использовать, например: DateFormat.yMd(myLocale.languageCode).format(now)где вы получаете текущий языковой стандарт устройства, например:Locale myLocale = Localizations.localeOf(context)
Zsolt
40

Добавьте intl пакет в свой 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");
CopsOnRoad
источник
18

При таком подходе нет необходимости импортировать какую-либо библиотеку.

DateTime now = DateTime.now();

String convertedDateTime = "${now.year.toString()}-${now.month.toString().padLeft(2,'0')}-${now.day.toString().padLeft(2,'0')} ${now.hour.toString()}-${now.minute.toString()}";
Способный ученик
источник
4
Помимо отсутствующего тире, это лучший способ обойтись без добавления еще одной зависимости.
01000101,
1
Это хорошо, но час возвращается не по американскому стандартному времени в 24-часовом формате. Арифметика ... вздох ... забудь, я просто получу посылку
Амир Мемон
12

Попробуйте этот пакет, 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
Джама Мохамед
источник
5

есть некоторые изменения по сравнению с 0.16, вот как я это сделал,

импорт в pubspec.yaml

dependencies:
      flutter:
        sdk: flutter
      intl: ^0.16.1

тогда используйте

  txdate= DateTime.now()


  DateFormat.yMMMd().format(txdate)
асли
источник
4

Вот мое простое решение. Для этого не требуется никакой зависимости.

Однако дата будет в строковом формате. Если вам нужно время, измените значения подстроки

print(new DateTime.now()
            .toString()
            .substring(0,10)
     );   // 2020-06-10
зизутг
источник
2

Используйте эту функцию

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
Харбдоллар
источник
2

Вы также можете использовать этот синтаксис. Для ГГГГ-ММ-ДЖД ЧЧ-ММ:

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}';
Жан Карлос
источник
Это не добавляет правильного заполнения для реального «гггг-ММ-дд»
01000101
1

Используйте метод разделения строк, чтобы удалить: 00.000

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

======= ИЛИ ИСПОЛЬЗУЙТЕ НИЖЕ код для формата ГГГГ-ММ-ДД ЧЧ: ММ: СС без использования библиотеки ====

var stringList =  DateTime.now().toIso8601String().split(new RegExp(r"[T\.]"));
var formatedDate = "${stringList[0]} ${stringList[1]}";
Мохд Даниш Хан
источник