or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

comparison-validation.mdcreation-parsing.mddisplay-formatting.mdduration.mdgetters-setters.mdindex.mdlocale.mdmanipulation.mdutilities.md

duration.mddocs/

0

# Duration Operations

1

2

Complete duration system for working with time intervals, performing duration arithmetic, and formatting duration output. Durations represent lengths of time rather than specific points in time.

3

4

## Capabilities

5

6

### Duration Creation

7

8

Methods for creating Duration instances from various input types.

9

10

```javascript { .api }

11

/**

12

* Create a Duration instance

13

* @param inp - Duration input (number, string, object, Duration, or from/to object)

14

* @param unit - Unit of time when inp is number/string

15

* @returns New Duration instance

16

*/

17

function duration(inp?: DurationInputArg1, unit?: DurationInputArg2): Duration;

18

19

// Input types

20

type DurationInputArg1 = Duration | number | string | FromTo | DurationInputObject | void;

21

type DurationInputArg2 = unitOfTime.DurationConstructor;

22

23

interface DurationInputObject extends MomentInputObject {

24

quarters?: numberlike;

25

quarter?: numberlike;

26

Q?: numberlike;

27

weeks?: numberlike;

28

week?: numberlike;

29

w?: numberlike;

30

}

31

32

interface FromTo {

33

from: MomentInput;

34

to: MomentInput;

35

}

36

37

// Duration constructor units

38

type DurationConstructor = "year" | "years" | "y" |

39

"quarter" | "quarters" | "Q" |

40

"month" | "months" | "M" |

41

"week" | "weeks" | "w" |

42

"isoWeek" | "isoWeeks" | "W" |

43

"day" | "days" | "d" |

44

"hour" | "hours" | "h" |

45

"minute" | "minutes" | "m" |

46

"second" | "seconds" | "s" |

47

"millisecond" | "milliseconds" | "ms";

48

```

49

50

**Usage Examples:**

51

52

```javascript

53

import moment from "moment";

54

55

// From number and unit

56

const hours2 = moment.duration(2, "hours");

57

const minutes30 = moment.duration(30, "minutes");

58

const days5 = moment.duration(5, "days");

59

60

// From milliseconds (default unit)

61

const ms5000 = moment.duration(5000); // 5 seconds

62

63

// From object

64

const complex = moment.duration({

65

years: 1,

66

months: 2,

67

days: 3,

68

hours: 4,

69

minutes: 5,

70

seconds: 6

71

});

72

73

// From string (ISO 8601 duration format)

74

const iso = moment.duration("P1Y2M3DT4H5M6S"); // 1 year, 2 months, 3 days, 4 hours, 5 minutes, 6 seconds

75

const simple = moment.duration("2:30:45"); // 2 hours, 30 minutes, 45 seconds

76

77

// From two moments (time between them)

78

const start = moment("2023-12-25T10:00:00");

79

const end = moment("2023-12-25T15:30:00");

80

const between = moment.duration({ from: start, to: end });

81

82

// Clone existing duration

83

const original = moment.duration(2, "hours");

84

const copy = moment.duration(original);

85

86

console.log(hours2.asHours()); // 2

87

console.log(minutes30.asMinutes()); // 30

88

console.log(complex.asMilliseconds()); // Total milliseconds

89

console.log(between.asHours()); // 5.5 hours

90

```

91

92

### Duration Arithmetic

93

94

Methods for adding and subtracting durations.

95

96

```javascript { .api }

97

/**

98

* Add time to this duration

99

* @param inp - Amount to add (number, string, Duration, or object)

100

* @param unit - Unit of time when inp is number/string

101

* @returns New Duration instance (original is not modified)

102

*/

103

add(inp?: DurationInputArg1, unit?: DurationInputArg2): Duration;

104

105

/**

106

* Subtract time from this duration

107

* @param inp - Amount to subtract (number, string, Duration, or object)

108

* @param unit - Unit of time when inp is number/string

109

* @returns New Duration instance (original is not modified)

110

*/

111

subtract(inp?: DurationInputArg1, unit?: DurationInputArg2): Duration;

112

113

/**

114

* Get absolute value of duration (remove negative sign)

115

* @returns New Duration instance with positive value

116

*/

117

abs(): Duration;

118

119

/**

120

* Create a copy of this Duration instance

121

* @returns New Duration instance with same values

122

*/

123

clone(): Duration;

124

```

125

126

**Usage Examples:**

127

128

```javascript

129

import moment from "moment";

130

131

const duration1 = moment.duration(2, "hours");

132

const duration2 = moment.duration(30, "minutes");

133

134

// Add durations

135

const sum = duration1.add(duration2);

136

console.log(sum.asMinutes()); // 150 minutes (2.5 hours)

137

138

// Add with different input types

139

const base = moment.duration(1, "hour");

140

const added1 = base.add(30, "minutes");

141

const added2 = base.add({ minutes: 45, seconds: 30 });

142

const added3 = base.add("PT30M"); // ISO 8601 format

143

144

console.log(added1.asMinutes()); // 90 minutes

145

console.log(added2.asMinutes()); // 105.5 minutes

146

console.log(added3.asMinutes()); // 90 minutes

147

148

// Subtract durations

149

const total = moment.duration(3, "hours");

150

const remaining = total.subtract(45, "minutes");

151

console.log(remaining.asHours()); // 2.25 hours

152

153

// Absolute value

154

const negative = moment.duration(-2, "hours");

155

const positive = negative.abs();

156

console.log(negative.asHours()); // -2

157

console.log(positive.asHours()); // 2

158

159

// Chaining operations

160

const result = moment.duration(1, "day")

161

.add(6, "hours")

162

.subtract(30, "minutes")

163

.add({ hours: 2, minutes: 15 });

164

console.log(result.asHours()); // 31.75 hours

165

166

// Clone to avoid mutation

167

const original = moment.duration(2, "hours");

168

const modified = original.clone().add(1, "hour");

169

console.log(original.asHours()); // 2 (unchanged)

170

console.log(modified.asHours()); // 3

171

```

172

173

### Duration Getters

174

175

Methods for retrieving duration components and converted values.

176

177

```javascript { .api }

178

/**

179

* Get duration component for specific unit

180

* @param units - Time unit to get

181

* @returns Value for the specified unit

182

*/

183

get(units: unitOfTime.Base): number;

184

185

/**

186

* Convert entire duration to specified unit

187

* @param units - Time unit to convert to

188

* @returns Total duration in specified unit

189

*/

190

as(units: unitOfTime.Base): number;

191

192

// Specific component getters (get portion of duration)

193

milliseconds(): number;

194

seconds(): number;

195

minutes(): number;

196

hours(): number;

197

days(): number;

198

weeks(): number;

199

months(): number;

200

years(): number;

201

202

// Total duration converters (convert entire duration)

203

asMilliseconds(): number;

204

asSeconds(): number;

205

asMinutes(): number;

206

asHours(): number;

207

asDays(): number;

208

asWeeks(): number;

209

asMonths(): number;

210

asYears(): number;

211

212

// Base units

213

type Base = "year" | "years" | "y" |

214

"month" | "months" | "M" |

215

"week" | "weeks" | "w" |

216

"day" | "days" | "d" |

217

"hour" | "hours" | "h" |

218

"minute" | "minutes" | "m" |

219

"second" | "seconds" | "s" |

220

"millisecond" | "milliseconds" | "ms";

221

```

222

223

**Usage Examples:**

224

225

```javascript

226

import moment from "moment";

227

228

// Create a complex duration

229

const duration = moment.duration({

230

hours: 25,

231

minutes: 90,

232

seconds: 130

233

});

234

235

// Component getters (individual parts)

236

console.log(duration.hours()); // 1 (25 hours = 1 day + 1 hour)

237

console.log(duration.minutes()); // 32 (90 minutes + 130 seconds = 92 minutes = 1 hour + 32 minutes)

238

console.log(duration.seconds()); // 10 (130 seconds = 2 minutes + 10 seconds)

239

console.log(duration.days()); // 1 (from 25 hours)

240

241

// Total converters (entire duration in unit)

242

console.log(duration.asHours()); // 26.53... (total hours)

243

console.log(duration.asMinutes()); // 1592.17... (total minutes)

244

console.log(duration.asSeconds()); // 95530 (total seconds)

245

console.log(duration.asMilliseconds()); // 95530000 (total milliseconds)

246

247

// Generic get and as methods

248

console.log(duration.get("hours")); // 1 (component)

249

console.log(duration.as("hours")); // 26.53... (total)

250

console.log(duration.get("minutes")); // 32 (component)

251

console.log(duration.as("minutes")); // 1592.17... (total)

252

253

// Simple duration examples

254

const simple = moment.duration(2.5, "hours");

255

console.log(simple.hours()); // 2 (component)

256

console.log(simple.minutes()); // 30 (component)

257

console.log(simple.asHours()); // 2.5 (total)

258

console.log(simple.asMinutes()); // 150 (total)

259

260

// Negative durations

261

const negative = moment.duration(-75, "minutes");

262

console.log(negative.hours()); // -1

263

console.log(negative.minutes()); // -15

264

console.log(negative.asHours()); // -1.25

265

```

266

267

### Duration Formatting and Display

268

269

Methods for converting durations to human-readable strings.

270

271

```javascript { .api }

272

/**

273

* Get human-readable representation of duration

274

* @param argWithSuffix - Include "ago"/"in" suffix (default: false)

275

* @param argThresholds - Custom thresholds for units

276

* @returns Human-readable string like "2 hours", "a day"

277

*/

278

humanize(argWithSuffix?: boolean, argThresholds?: argThresholdOpts): string;

279

humanize(argThresholds?: argThresholdOpts): string;

280

281

/**

282

* Get ISO 8601 duration string representation

283

* @returns ISO 8601 formatted string like "PT2H30M"

284

*/

285

toISOString(): string;

286

287

/**

288

* Get JSON representation (same as toISOString)

289

* @returns ISO 8601 formatted string for JSON serialization

290

*/

291

toJSON(): string;

292

293

/**

294

* Check if this duration represents a valid time span

295

* @returns true if valid, false otherwise

296

*/

297

isValid(): boolean;

298

299

/**

300

* Get numeric value (milliseconds, same as asMilliseconds)

301

* @returns Duration in milliseconds

302

*/

303

valueOf(): number;

304

305

interface argThresholdOpts {

306

ss?: number; // seconds

307

s?: number; // second

308

m?: number; // minute

309

h?: number; // hour

310

d?: number; // day

311

w?: number | void; // week

312

M?: number; // month

313

}

314

```

315

316

**Usage Examples:**

317

318

```javascript

319

import moment from "moment";

320

321

// Basic humanization

322

const duration1 = moment.duration(2, "hours");

323

const duration2 = moment.duration(90, "minutes");

324

const duration3 = moment.duration(1, "day");

325

326

console.log(duration1.humanize()); // "2 hours"

327

console.log(duration2.humanize()); // "an hour" (90 minutes rounds to 1 hour)

328

console.log(duration3.humanize()); // "a day"

329

330

// With suffix

331

console.log(duration1.humanize(true)); // "in 2 hours"

332

console.log(moment.duration(-2, "hours").humanize(true)); // "2 hours ago"

333

334

// Various durations

335

const examples = [

336

moment.duration(45, "seconds"),

337

moment.duration(2, "minutes"),

338

moment.duration(1, "hour"),

339

moment.duration(2, "days"),

340

moment.duration(1, "week"),

341

moment.duration(3, "months"),

342

moment.duration(1, "year")

343

];

344

345

examples.forEach(d => {

346

console.log(`${d.asMilliseconds()}ms -> ${d.humanize()}`);

347

});

348

// Output:

349

// "45000ms -> a few seconds"

350

// "120000ms -> 2 minutes"

351

// "3600000ms -> an hour"

352

// "172800000ms -> 2 days"

353

// "604800000ms -> 7 days"

354

// "7776000000ms -> 3 months"

355

// "31536000000ms -> a year"

356

357

// ISO 8601 formatting

358

const complex = moment.duration({

359

years: 1,

360

months: 2,

361

days: 3,

362

hours: 4,

363

minutes: 5,

364

seconds: 6

365

});

366

367

console.log(complex.toISOString()); // "P1Y2M3DT4H5M6S"

368

console.log(duration1.toISOString()); // "PT2H"

369

console.log(moment.duration(90, "minutes").toISOString()); // "PT1H30M"

370

371

// JSON serialization

372

console.log(JSON.stringify({ duration: duration1 })); // {"duration":"PT2H"}

373

374

// Validation

375

console.log(duration1.isValid()); // true

376

console.log(moment.duration("invalid").isValid()); // false

377

378

// Numeric value

379

console.log(duration1.valueOf()); // 7200000 (milliseconds)

380

console.log(+duration1); // 7200000 (same as valueOf)

381

382

// Custom thresholds for humanize

383

const customDuration = moment.duration(90, "seconds");

384

console.log(customDuration.humanize()); // "2 minutes" (default)

385

console.log(customDuration.humanize({ ss: 60 })); // "a minute" (custom threshold)

386

```

387

388

### Duration Localization

389

390

Localization support for duration formatting.

391

392

```javascript { .api }

393

/**

394

* Get or set locale for this duration instance

395

* @param locale - Locale identifier (when setting)

396

* @returns Current locale string (when getting) or this duration (when setting)

397

*/

398

locale(): string;

399

locale(locale: LocaleSpecifier): Duration;

400

401

/**

402

* Get locale data object for this duration's locale

403

* @returns Locale data object

404

*/

405

localeData(): Locale;

406

407

type LocaleSpecifier = string | Moment | Duration | string[] | boolean;

408

```

409

410

**Usage Examples:**

411

412

```javascript

413

import moment from "moment";

414

415

const duration = moment.duration(2, "hours");

416

417

// Default locale

418

console.log(duration.humanize()); // "2 hours"

419

console.log(duration.locale()); // "en"

420

421

// Set locale

422

const frenchDuration = duration.clone().locale("fr");

423

console.log(frenchDuration.humanize()); // "2 heures"

424

console.log(frenchDuration.locale()); // "fr"

425

426

// Different locales

427

const germanDuration = duration.clone().locale("de");

428

console.log(germanDuration.humanize()); // "2 Stunden"

429

430

// Relative time with suffix in different locales

431

const relativeDuration = moment.duration(30, "minutes");

432

console.log(relativeDuration.humanize(true)); // "in 30 minutes"

433

console.log(relativeDuration.clone().locale("fr").humanize(true)); // "dans 30 minutes"

434

console.log(relativeDuration.clone().locale("es").humanize(true)); // "en 30 minutos"

435

436

// Locale data

437

const localeData = frenchDuration.localeData();

438

console.log(localeData.relativeTime.h); // "une heure" (French hour format)

439

```

440

441

### Duration Utilities and Advanced Usage

442

443

Advanced patterns and utility methods for working with durations.

444

445

```javascript { .api }

446

/**

447

* Create duration from the difference between two moments

448

* @param from - Start moment

449

* @param to - End moment

450

* @returns Duration representing the time between moments

451

*/

452

// Usage: moment.duration({ from: moment1, to: moment2 })

453

454

/**

455

* Parse ISO 8601 duration strings

456

* @param input - ISO 8601 duration string

457

* @returns Duration instance

458

*/

459

// Usage: moment.duration("P1Y2M3DT4H5M6S")

460

```

461

462

**Advanced Usage Examples:**

463

464

```javascript

465

import moment from "moment";

466

467

// Calculate age as duration

468

function getAge(birthDate) {

469

const birth = moment(birthDate);

470

const now = moment();

471

return moment.duration({ from: birth, to: now });

472

}

473

474

const age = getAge("1990-06-15");

475

console.log(age.humanize()); // "33 years" (approximate)

476

console.log(age.asYears()); // 33.5... (precise)

477

478

// Time remaining calculations

479

function timeUntil(targetDate) {

480

const target = moment(targetDate);

481

const now = moment();

482

return moment.duration({ from: now, to: target });

483

}

484

485

const christmas = timeUntil("2024-12-25");

486

console.log(christmas.humanize()); // "11 months" (approximate)

487

console.log(`${christmas.days()} days remaining`); // Exact days

488

489

// Working time calculations

490

function calculateWorkingHours(startTime, endTime, breaks = []) {

491

let totalTime = moment.duration({ from: startTime, to: endTime });

492

493

breaks.forEach(breakPeriod => {

494

const breakDuration = moment.duration({

495

from: breakPeriod.start,

496

to: breakPeriod.end

497

});

498

totalTime = totalTime.subtract(breakDuration);

499

});

500

501

return totalTime;

502

}

503

504

const workStart = moment("2023-12-25T09:00:00");

505

const workEnd = moment("2023-12-25T17:30:00");

506

const breaks = [

507

{ start: moment("2023-12-25T12:00:00"), end: moment("2023-12-25T13:00:00") },

508

{ start: moment("2023-12-25T15:00:00"), end: moment("2023-12-25T15:15:00") }

509

];

510

511

const workingTime = calculateWorkingHours(workStart, workEnd, breaks);

512

console.log(workingTime.asHours()); // 7.25 hours

513

514

// Duration formatting for timers

515

function formatTimer(milliseconds) {

516

const duration = moment.duration(milliseconds);

517

const hours = String(Math.floor(duration.asHours())).padStart(2, '0');

518

const minutes = String(duration.minutes()).padStart(2, '0');

519

const seconds = String(duration.seconds()).padStart(2, '0');

520

return `${hours}:${minutes}:${seconds}`;

521

}

522

523

console.log(formatTimer(3661000)); // "01:01:01"

524

console.log(formatTimer(7323000)); // "02:02:03"

525

526

// Sum multiple durations

527

function sumDurations(durations) {

528

return durations.reduce((total, current) => {

529

return total.add(current);

530

}, moment.duration(0));

531

}

532

533

const durations = [

534

moment.duration(1, "hour"),

535

moment.duration(30, "minutes"),

536

moment.duration(45, "minutes"),

537

moment.duration(15, "minutes")

538

];

539

540

const total = sumDurations(durations);

541

console.log(total.asHours()); // 2.5 hours

542

543

// Parse complex duration strings

544

const isoDurations = [

545

"PT1H30M", // 1 hour 30 minutes

546

"P1DT2H", // 1 day 2 hours

547

"P1Y2M3DT4H5M6S", // Complex duration

548

"PT45S" // 45 seconds

549

];

550

551

isoDurations.forEach(iso => {

552

const duration = moment.duration(iso);

553

console.log(`${iso} -> ${duration.humanize()}`);

554

});

555

```

556

557

## Duration Constants and Thresholds

558

559

Moment.js uses internal thresholds to determine humanized output:

560

561

```javascript

562

// Default thresholds (approximate)

563

// ss: 44 seconds -> "a few seconds"

564

// s: 44 seconds -> "a minute"

565

// m: 44 minutes -> "an hour"

566

// h: 21 hours -> "a day"

567

// d: 25 days -> "a month"

568

// M: 10 months -> "a year"

569

```

570

571

These can be configured globally using `moment.relativeTimeThreshold()` or per-call using the thresholds parameter in `humanize()`.