flutter Dart -如何设置DateTime对象的小时和分钟

8xiog9wr  于 2023-03-13  发布在  Flutter
关注(0)|答案(9)|浏览(272)

如何设置/更改DateTime对象的小时和/或分钟。类似于JavaScript中的Date.setHours(..)
如果我做了

var time = DateTime.parse("2018-08-16T11:00:00.000Z");

如何设置time的小时和分钟

txu3uszq

txu3uszq1#

var newHour = 5;
time = time.toLocal();
time = new DateTime(time.year, time.month, time.day, newHour, time.minute, time.second, time.millisecond, time.microsecond);

曾经讨论过添加一个update()方法,该方法只允许修改特定的部分,但看起来并没有实现。

eimct9ow

eimct9ow2#

现在有了扩展名,你就可以这样做了

extension MyDateUtils on DateTime {
  DateTime copyWith({
    int? year,
    int? month,
    int? day,
    int? hour,
    int? minute,
    int? second,
    int? millisecond,
    int? microsecond,
  }) {
    return DateTime(
      year ?? this.year,
      month ?? this.month,
      day ?? this.day,
      hour ?? this.hour,
      minute ?? this.minute,
      second ?? this.second,
      millisecond ?? this.millisecond,
      microsecond ?? this.microsecond,
    );
  }
}
093gszye

093gszye3#

我有个更简单的办法

DateTime newDate = DateTime.now();
DateTime formatedDate = newDate.subtract(Duration(hours: newDate.hour, minutes: newDate.minute, seconds: newDate.second, milliseconds: newDate.millisecond, microseconds: newDate.microsecond));

则“formatedDate”中的XX:XX应为00:00
说明:
formatedDate是一个新的DateTime变量,其内容为newDate减去小时、分钟...

yk9xbfzb

yk9xbfzb4#

我相信这是一个比公认答案更好的解决方案:

DateTime dateTime = DateFormat('dd-MM-yyyy h:mm:ssa', 'en_US').parseLoose('01-11-2020 2:00:00AM');
fafcakar

fafcakar5#

您可以将Extension Methods与dart一起使用来扩展现有库。
首先通过扩展DateTime对象定义扩展名:

extension DateTimeExt on DateTime {
  DateTime applyTimeOfDay({required int hour, required int minute}) {
      return DateTime(year, month, day, hour, minute);
}
}

一旦定义了新方法,就可以像调用该对象的已定义方法一样调用它。
在本例中,一旦定义了applyTimeOfDay()方法,就可以像这样调用它:

int myNewHour = 10
int myNewMinute = 8
var time = DateTime.parse("2018-08-16T11:00:00.000Z");
time = time.applyTimeOfDay(hour : myNewHour, minute : myNewMinute);
f4t66c6m

f4t66c6m6#

您可以删除当前的小时和分钟,然后添加所需的小时和分钟。
因此,如果您想将时间设置为例如23:59,您可以这样做:

final date = DateTime.now();
    date
      ..subtract(Duration(hours: date.hour, minutes: date.minute))
      ..add(Duration(hours: 23, minutes: 59));

(Note其他时间单位,如秒和毫秒,在这里没有改变)

oogrdqng

oogrdqng7#

我在小部件中使用DateTime对象的格式化形式(使用DateFormat)时遇到了一些问题,因为showDatePicker带来了一个新的DateTime示例,调用setState对视图没有影响。
可能有更好的方法来满足我的问题,但我决定创建我自己的一个,它可以使用.update方法更新。

import 'package:flutter/material.dart';

class MDateTime {
  int year, month, day, hour, min, sec;

  factory MDateTime.fromDateTime(DateTime dateTime) {
    return MDateTime(
      dateTime.year,
      dateTime.month,
      dateTime.day,
      dateTime.hour,
      dateTime.minute,
      dateTime.second,
    );
  }

  MDateTime([
    this.year = 0,
    this.month = 0,
    this.day = 0,
    this.hour = 0,
    this.min = 0,
    this.sec = 0,
  ]);

  void update({
    int? newYear,
    int? newMonth,
    int? newDay,
    int? newHour,
    int? newMin,
    int? newSec,
  }) {
    year = newYear ?? year;
    month = newMonth ?? month;
    day = newDay ?? day;
    hour = newHour ?? hour;
    min = newMin ?? min;
    sec = newSec ?? sec;
  }

  DateTime toDateTime() {
    return DateTime(year, month, day, hour, min, sec);
  }

  TimeOfDay toTimeOfDay() {
    return TimeOfDay(hour :hour, minute:  min);
  }

  String formatDate({String divider = "-"}){
    return "$year$divider$month$divider$day";
  }

  String formatTime({String divider = ":"}){
    return "$hour$divider$min$divider$sec";
  }
}

此外,不需要使用另一个包来设置日期-时间格式。

raogr8fs

raogr8fs8#

您也可以使用这个包Jiffy,通过将DateTime加上或减去来实现这一点。它还考虑闰年和每个月有多少天

var updateTime = Jiffy.parse("2018-08-16T11:00:00.000Z").add(hours: 1); // 2018-08-16 12:00:00.000Z

print(updateTime.dateTime); // 2018-08-16 12:30:00.000Z

// also you can format it
print(updateTime.format("yyyy, MMM")); // 2018, Aug

// or use default formats
print(updateTime.yMMMEdjm); // Thu, Aug 16, 2018 12:30 PM
eiee3dmh

eiee3dmh9#

变量新小时= 5;time =到本地的时间();时间=新日期时间(时间.年、时间.月、time.day、新小时、时间.分钟、时间.秒、时间.毫秒、时间.微秒);

相关问题