【发布时间】:2021-11-20 13:17:34
【问题描述】:
我试图做这样的事情但失败了。我可以在一天内编写代码,但还剩多少小时和分钟。
示例图片:
【问题讨论】:
我试图做这样的事情但失败了。我可以在一天内编写代码,但还剩多少小时和分钟。
示例图片:
【问题讨论】:
如果您想将Duration 转换为天、分、小时和秒,您可以这样做:
var days = duration.inDays;
var hours = duration.inHours % 24;
var minutes = duration.inMinutes % 60;
var seconds = duration.inSeconds % 60;
(如果您从总秒数而不是从 Duration 对象开始,您可以轻松地首先构造一个 Duration 对象:Duration(seconds: totalSeconds)。)
请参阅https://stackoverflow.com/a/68685066/ 了解更复杂的版本,它将Duration 格式化为String 的1d2h3.45s 形式。
【讨论】:
我为个人项目做了类似的东西,这就是 sn-p。这是一个辅助函数,你必须给它ms,即EndDateInMs - StartDateInMs。还有一个TimeFrame 类型,但你不需要它;只需计算周/天/小时/分钟的逻辑即可。
import '../enums/enums.dart';
Map<TimeFrame, int> msConverter(double ms) {
int minutes;
int hours;
int days;
int weeks;
const msInWeek = 6.048e+8;
weeks = (ms / msInWeek).floor();
final msLeftForDays = ms - (msInWeek * weeks);
const msInDay = 8.64e+7;
days = (msLeftForDays / msInDay).floor();
final msLeftForHours = msLeftForDays - (msInDay * days);
const msInHour = 3.6e+6;
hours = (msLeftForHours / msInHour).floor();
final msLeftForMinutes = msLeftForHours - (msInHour * hours);
const msInMinute = 60000;
minutes = (msLeftForMinutes / msInMinute).round();
return <TimeFrame, int>{
TimeFrame.Weeks: weeks,
TimeFrame.Days: days,
TimeFrame.Hours: hours,
TimeFrame.Minutes: minutes,
};
}
【讨论】:
6.048e+8 是一个以科学计数法 (6.048 * 10^8) 表示的double。使用这种方法,我个人将完全避免使用doubles,并将不可读(且容易出错)的幻数替换为const msInWeek = 7 * 24 * 60 * 60 * 1000 之类的东西。我也会使用截断除法 (~/) 而不是使用floor()。