31

给定 int 值1807,格式化为30:07使用 date-fns?

是的,我知道这可以用 vanilla js 来实现,但是这可以使用 date-fns 吗?

4

6 回答 6

25

根据date-fns/date-fns#229 (comment)中的示例代码,我们现在可以使用intervalToDuration将 seconds 转换为 a Duration,然后可以根据 OP 的需要简化格式:

import {  intervalToDuration } from 'date-fns'

const seconds = 10000

intervalToDuration({ start: 0, end: seconds * 1000 })
// { hours: 2, minutes: 46, seconds: 40 }

因此,对于 OP 的需求:

import {  intervalToDuration } from 'date-fns'

const seconds = 1807
const duration = intervalToDuration({ start: 0, end: seconds * 1000 })
// { minutes: 30, seconds: 7 }

const formatted = `${duration.minutes}:${duration.seconds}`

于 2021-01-13T23:32:49.567 回答
21

您可以通过简单地修改中间帮助日期来使用 date-fns 来做到这一点。使用new Date( 0 )您将获得设置为 1970 年 1 月 1 日 00:00:00 UTC 的日期。然后,您可以使用addSecondsfrom date-fns 添加相关秒数(实际上您可以为此使用本机日期setTime( 1000 * seconds ))。格式化它的分钟和秒将为您提供所需的结果。

var input = document.getElementById('seconds');
var output = document.getElementById('out');

output.innerText = formattedTime(input.value);
input.addEventListener('input', function() {
  output.innerText = formattedTime(input.value);
});

function formattedTime(seconds) {
  var helperDate = dateFns.addSeconds(new Date(0), seconds);
  return dateFns.format(helperDate, 'mm:ss');
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/date-fns/1.26.0/date_fns.min.js"></script>

<input type="number" id="seconds" value="1807">
<pre id="out"></pre>

于 2018-03-09T09:48:45.030 回答
18

这是简单的实现:

import { formatDistance } from 'date-fns'

const duration = s => formatDistance(0, s * 1000, { includeSeconds: true })

duration(50) // 'less than a minute'
duration(1000) // '17 minutes'

这与以下内容基本相同:

import moment from 'moment'    

const duration = s => moment.duration(s, 'seconds').humanize()

duration(50) // 'a minute'
duration(1000) // '17 minutes'
于 2018-10-11T20:44:13.320 回答
12

此函数将秒转换为持续时间格式 hh:mm:ss,它在 moment.js 中的模拟持续时间

import { addHours, getMinutes, getHours, getSeconds } from 'date-fns';

export const convertToDuration = (secondsAmount: number) => {
    const normalizeTime = (time: string): string =>
    time.length === 1 ? `0${time}` : time;

    const SECONDS_TO_MILLISECONDS_COEFF = 1000;
    const MINUTES_IN_HOUR = 60;

    const milliseconds = secondsAmount * SECONDS_TO_MILLISECONDS_COEFF;

    const date = new Date(milliseconds);
    const timezoneDiff = date.getTimezoneOffset() / MINUTES_IN_HOUR;
    const dateWithoutTimezoneDiff = addHours(date, timezoneDiff);

    const hours = normalizeTime(String(getHours(dateWithoutTimezoneDiff)));
    const minutes = normalizeTime(String(getMinutes(dateWithoutTimezoneDiff)));
    const seconds = normalizeTime(String(getSeconds(dateWithoutTimezoneDiff)));

    const hoursOutput = hours !== '00' ? `${hours}:` : '';

    return `${hoursOutput}${minutes}:${seconds}`;
};
于 2019-01-09T11:44:49.473 回答
4

只需使用date-fns中的格式,如下所示:

format((seconds * 1000), 'mm:ss')

如果还需要删除时区小时偏移量, 可以使用getTimezoneOffset(以分钟为单位) :

    let dt = new Date((seconds * 1000));
    dt = addMinutes(dt, dt.getTimezoneOffset());
    return format(dt, 'mm:ss');
于 2021-11-10T21:27:52.270 回答
2

date-fns 中似乎没有直接等同于 moment.duration ...

我写的这个函数可能会对某人有所帮助。日期-fns。differenceInSeconds用于获取以秒为单位的总差异。毫秒、分钟等有等效的方法。然后我使用 vanilla js 数学来格式化

/**
* calculates the duration between two dates.
* @param {date object} start The start date.
* @param {date object} finish The finish date.
* @return {string} a string of the duration with format 'hh:mm'
*/
export const formatDuration = (start, finish) => {
    const diffTime = differenceInSeconds(finish, start);
    if (!diffTime) return '00:00'; // divide by 0 protection
    const minutes = Math.abs(Math.floor(diffTime / 60) % 60).toString();
    const hours = Math.abs(Math.floor(diffTime / 60 / 60)).toString();
    return `${hours.length < 2 ? 0 + hours : hours}:${minutes.length < 2 ? 0 + minutes : minutes}`;
};
于 2019-12-23T10:51:23.310 回答