Как отформатировать DateTime во Flutter, как получить текущее время во флаттере?

Я пытаюсь отобразить текущий 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?

145
0
175 380
11
Перейти к ответу Данный вопрос помечен как решенный

Ответы 11

Ответ принят как подходящий

Вы можете использовать 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. Последнюю версию библиотеки можно найти здесь.

Defuera 03.11.2018 21:12

пакет intl имеет очень низкие рейтинги

Aseem 29.12.2019 00:09

Кому-нибудь еще, что статические члены недоступны в инициализаторах?

MrPool 02.01.2020 13:07

@MrPool Да, та же проблема со статическими членами недоступна в инициализаторах. Очень неприятно, потому что статическая дата не имеет смысла.

Michael Tolsma 28.04.2020 12:33

Если вы хотите использовать конкретный языковой стандарт, вы можете использовать, например: DateFormat.yMd(myLocale.languageCode).format(now), где вы можете получить текущий языковой стандарт устройства следующим образом: Locale myLocale = Localizations.localeOf(context)

Zsolt 24.05.2020 15:23

Добавьте 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");

Попробуйте этот пакет, Джиффи, он также работает поверх 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

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

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

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

импорт в pubspec.yaml

dependencies:
      flutter:
        sdk: flutter
      intl: ^0.16.1

тогда использовать

  txdate= DateTime.now()


  DateFormat.yMMMd().format(txdate)

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

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()}";

Выход

2020-12-05 14:57

Помимо отсутствующего тире, это лучший способ обойтись без добавления еще одной зависимости.

01000101 19.05.2020 20:03

Это хорошо, но час возвращается не по американскому стандартному времени в 24-часовом формате. Арифметика ... вздох ... забудь, я просто получу посылку

Amir Memon 28.05.2020 15:58

В чем проблема с внешними зависимостями? Вот как все устроено в 2020 году :-)

funder7 01.01.2021 23:11

@ funder7 - Каждая добавляемая вами внешняя зависимость является потенциальной точкой отказа в вашей базе кода. Зависимости поддерживаются третьими сторонами, поэтому у вас нет абсолютно никаких гарантий относительно функциональности и стабильности этого стороннего кода на каждой итерации (т. Е. При изменении версии). Таким образом, разумно иметь как можно меньше зависимостей в производственном коде.

SilSur 27.01.2021 21:22

Да, это может быть правдой, но вы можете придерживаться фиксированной версии, если боитесь регресса. Пользователи, которые разрабатывают внешние библиотеки, обычно предоставляют хороший код: рассмотрите приведенный выше фрагмент: он возвращает дату в ожидаемом формате, но, на мой взгляд, это некрасиво, учитывая, что Flutter имеет библиотеку intl, которая очень хорошо обрабатывает интернационализацию даты / времени. Это проверенный код, вероятно, лучше, чем то, что вы получаете с cut'n'paste. Очевидно, я бы не стал импортировать внешнюю библиотеку для конкатенации строк ... но я думаю, вы меня поняли. Ваше здоровье ;)

funder7 28.01.2021 17:30

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

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».

01000101 19.05.2020 20:05

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

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

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

Это хорошо работает без каких-либо пакетов. Ниже приведен способ сделать это. DateTime now = DateTime.now (); DateTime date = new DateTime (now.year, now.month, now.day); print (date.toString (). substring (0, 10));

Raju Gupta 18.12.2020 09:56

Используйте метод разделения строки, чтобы удалить: 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]}";

Можно еще и секунды убрать? Благодарность

user3121134 27.01.2021 22:36

DateTime.now () устарел, используйте вместо этого clock.now ():

import 'package:clock/clock.dart';

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

Как насчет метода расширения просто для 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'

Не стесняйтесь предлагать изменения.

Другие вопросы по теме