简体   繁体   中英

How to format DateTime in Flutter

I am trying to display the current DateTime in a Text widget after tapping on a button. The following works, but I'd like to change the format.

Current approach

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

Result

YYYY-MM-JJ HH-MM:00.000

Question

How can I remove the :00.000 part?

You can use DateFormat from intl package.

import 'package:intl/intl.dart';

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

Add intl package to your pubspec.yaml file.

import 'package:intl/intl.dart';

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

Converting DateTime object to String

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

Converting String to DateTime object

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

With this approach, there is no need to import any library.

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

Output

2020-12-05 14:57

Try out this package, Jiffy , it also runs on top of Intl , but makes it easier using momentjs syntax. See below

import 'package:jiffy/jiffy.dart';   

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

You can also do the following

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

And you can also pass in your DateTime object, A string and an array

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

Here's my simple solution. That does not require any dependency.

However, the date will be in string format. If you want the time then change the substring values

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

there is some change since the 0.16 so here how i did,

import in the pubspec.yaml

dependencies:
      flutter:
        sdk: flutter
      intl: ^0.16.1

then use

  txdate= DateTime.now()


  DateFormat.yMMMd().format(txdate)

Use this function

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

Output:

08:41:AM
21-12-2019

You can also use this syntax. For 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}';

Use String split method to remove :00.000

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

======= OR USE BELOW code for YYYY-MM-DD HH:MM:SS format without using library ====

var stringList =  DateTime.now().toIso8601String().split(new RegExp(r"[T\.]"));
var formatedDate = "${stringList[0]} ${stringList[1]}";
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;
            }

call this method this way

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

DateTime.now() is deprecated, use clock.now() instead:

import 'package:clock/clock.dart';

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

How about a simple extension method for DateTime . Run-time is probably not great, since we're iterating the string multiple times and iterating over each % format option. Could probably walk through once and replace % greedily.

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

Usage:

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

Feel free to suggest changes.

What if user is US citizen but wants to see everything in 24hour format - then
showing 12/24 hour based of locale will not satisfy user

 // 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())}'

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

The best and easiest way to convert a sting int Dateformat is,

  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

Usa esta opción que puedes personalizar:

static String formatDateTime(DateTime fecha, String formato) {
    var _index = 0;
    var _letra = '';
    var _fecha = '';
    var _auxiliar = '';
    //
    //Evalua todas las letras
    while (_letra != '[/]') {
      _letra = _index < formato.length ? formato[_index++] : '[/]';
      //
      //suma las letra para luego aplicarles el formato
      if (_auxiliar.isEmpty || _auxiliar[0] == _letra) {
        _auxiliar += _letra;

        continue;
      }
      //
      //aplica el formato de las letras acumuladas
      switch (_auxiliar) {
        case 'yy':
          _fecha += fecha.year.toString().substring(2);
          break;
        case 'yyyy':
          _fecha += fecha.year.toString();
          break;
        case 'M':
          _fecha += fecha.month.toString();
          break;
        case 'MM':
          _fecha +=
              fecha.month < 10 ? '0${fecha.month}' : fecha.month.toString();
          break;
        case 'd':
          _fecha += fecha.day.toString();
          break;
        case 'dd':
          _fecha += fecha.day < 10 ? '0${fecha.day}' : fecha.day.toString();
          break;
        case 'h':
          _fecha += 12 < fecha.hour
              ? (fecha.hour - 12).toString()
              : fecha.hour.toString();
          break;
        case 'hh':
          _fecha += fecha.hour < 10
              ? '0${fecha.hour}'
              : 12 < fecha.hour
                  ? (fecha.hour - 12).toString()
                  : fecha.hour.toString();
          break;
        case 'H':
          _fecha += fecha.hour.toString();
          break;
        case 'HH':
          _fecha += fecha.hour < 10 ? '0${fecha.hour}' : fecha.hour.toString();
          break;
        case 'm':
          _fecha += fecha.minute.toString();
          break;
        case 'mm':
          _fecha +=
              fecha.minute < 10 ? '0${fecha.minute}' : fecha.minute.toString();
          break;
        case 's':
          _fecha += fecha.second.toString();
          break;
        case 'ss':
          _fecha +=
              fecha.second < 10 ? '0${fecha.second}' : fecha.second.toString();
          break;
        case 't':
          _fecha += fecha.hour < 12 ? 'a' : 'p';
          break;
        case 'tt':
          _fecha += fecha.hour < 12 ? 'am' : 'pm';
          break;
        case 'f':
        case 'ff':
        case 'fff':
        case 'ffff':
          _fecha += fecha.millisecond.toString().substring(0, _auxiliar.length);
          break;
        case 'z':
          if (fecha.isUtc) {
            _fecha += '0';
          } else {
            _fecha +=
                (fecha.timeZoneOffset.inMinutes / 60).truncate().toString();
          }
          break;
        case 'zz':
          if (fecha.isUtc) {
            _fecha += '00';
          } else {
            var _horas = (fecha.timeZoneOffset.inMinutes / 60).truncate();

            _fecha += (fecha.timeZoneOffset.inMinutes < 0 ? '-' : '+') +
                (_horas < 10 ? '0$_horas' : _horas.toString());
          }
          break;
        case 'zzz':
          if (fecha.isUtc) {
            _fecha += '00:00';
          } else {
            _fecha += (fecha.timeZoneOffset.inMinutes < 0 ? '-' : '+') +
                formatDateTime(
                    DateTime.fromMillisecondsSinceEpoch(
                        fecha.timeZoneOffset.inMilliseconds),
                    'hh:mm');
          }
          break;
        default:
          _fecha += _auxiliar;
          break;
      }
      //
      //siguiente
      _auxiliar = _letra;
    }
    //
    //Fin
    return _fecha;
  }

Usalo de la siguiente manera:

print(formatDateTime(DateTime.now().toUtc(), 'dd-MM-yyyy hh:mm tt'));
print(formatDateTime(DateTime.now().toUtc(), 'dd-MM-yyyy hh:mm tt (GTM zzz)'));
// 28-07-2022 04:52:59 pm
// 28-07-2022 04:52:59 pm (GTM -6:00)

El que no le guste el español lo puede traducir con google como hago yo con el inglés, saludos.

You can use parse flutter methods for string formatting, without rewriting it each time. For example see the month / day / year this is the method :

DateFormat().add_yMd().format("your date");

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM