PHPackages                             fresh/datetime - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. fresh/datetime

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

fresh/datetime
==============

PHP library that provides additional functions for processing dates &amp; times.

v5.0.1(3mo ago)17513.8k↓12.4%3[1 PRs](https://github.com/fre5h/datetime-php/pulls)2MITPHPPHP &gt;=8.4CI passing

Since Jun 14Pushed 1mo agoCompare

[ Source](https://github.com/fre5h/datetime-php)[ Packagist](https://packagist.org/packages/fresh/datetime)[ Docs](https://github.com/fre5h/datetime-php)[ GitHub Sponsors](https://github.com/fre5h)[ RSS](/packages/fresh-datetime/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (10)Dependencies (7)Versions (28)Used By (2)

DateTime
========

[](#datetime)

PHP library that provides additional functions for processing dates &amp; times. 🐘 🕒 📅

[![Scrutinizer Quality Score](https://camo.githubusercontent.com/3a88457863f61db7bf07906f53ecf47e047884f12204cc769fbbfc39efe39c11/68747470733a2f2f696d672e736869656c64732e696f2f7363727574696e697a65722f672f66726535682f6461746574696d652d7068702e7376673f7374796c653d666c61742d737175617265)](https://scrutinizer-ci.com/g/fre5h/datetime-php/)[![Build Status](https://camo.githubusercontent.com/fec44b0b201089736a5b7e6a61e6660eb2b5679ab44a96cd494ee02062424b0f/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f66726535682f6461746574696d652d7068702f63692e79616d6c3f6272616e63683d6d61696e267374796c653d666c61742d737175617265)](https://github.com/fre5h/datetime-php/actions?query=workflow%3ACI+branch%3Amain+)[![CodeCov](https://camo.githubusercontent.com/da41f9187c92ba5f50723e1555ec48f03dbb116b1472583193f2d3c7eb38f221/68747470733a2f2f696d672e736869656c64732e696f2f636f6465636f762f632f6769746875622f66726535682f6461746574696d652d7068702e7376673f7374796c653d666c61742d737175617265)](https://codecov.io/github/fre5h/datetime-php)[![License](https://camo.githubusercontent.com/8108f5643a2388e1e97f8233bad1e06f282145985d181d5722d99f236162b361/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f6c2f66726573682f6461746574696d652e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/fresh/datetime)[![Latest Stable Version](https://camo.githubusercontent.com/34c56eef63909d6fecb7f730ad6d762a5ec9fc6ebd08e69495992fa3d4ff7c8a/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f66726573682f6461746574696d652e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/fresh/datetime)[![Total Downloads](https://camo.githubusercontent.com/06622356f62ca87fe3cf4415e5ea642b713365b3e28c56d8a8710539b86f431b/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f66726573682f6461746574696d652e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/fresh/datetime)[![StyleCI](https://camo.githubusercontent.com/b37903b3e12e927b9ae525cde2ea1a1d6c9c4b01f5f23f2bbcd56e6c5d924f63/68747470733a2f2f7374796c6563692e696f2f7265706f732f3139303835343933382f736869656c643f7374796c653d666c61742d737175617265)](https://styleci.io/repos/190854938)[![Gitter](https://camo.githubusercontent.com/38615bd37fa667fefc3415d970da6c8f0de8796527cb97a89dfc59435f3189bd/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6769747465722d6a6f696e253230636861742d627269676874677265656e2e7376673f7374796c653d666c61742d737175617265)](https://gitter.im/fre5h/datetime-php)

Requirements
------------

[](#requirements)

- PHP 8.4

Installation 🌱
--------------

[](#installation-)

`composer req fresh/datetime`

Features 🎁
----------

[](#features-)

### Popular time constants

[](#popular-time-constants)

Number of seconds in a minute, number of minutes in an hour, etc.

```
use Fresh\DateTime\TimeConstants;

echo TimeConstants::NUMBER_OF_SECONDS_IN_AN_HOUR; // etc.
```

### Methods for creating current `\DateTime` and `\DateTimeImmutable` objects (convenient for testing)

[](#methods-for-creating-current-datetime-and-datetimeimmutable-objects-convenient-for-testing)

If you use separate class for creating datetime objects, you can mock these methods in your code and have the expected `\DateTime` object what you need.

```
use Fresh\DateTime\DateTimeHelper;

$dateTimeHelper = new DateTimeHelper();

$now1 = $dateTimeHelper->getCurrentDatetime();
$now2 = $dateTimeHelper->getCurrentDatetime(new \DateTimeZone('Europe/Kyiv')); // Or with custom timezone
$now3 = $dateTimeHelper->getCurrentDatetimeUtc(); // Always in UTC
$now4 = $dateTimeHelper->getCurrentDatetimeImmutable();
$now5 = $dateTimeHelper->getCurrentDatetimeImmutable(new \DateTimeZone('Europe/Kyiv')); // Or with custom timezone
$now6 = $dateTimeHelper->getCurrentDatetimeImmutableUtc(); // Always in UTC
```

Compatible with [PSR-20: Clock](https://www.php-fig.org/psr/psr-20/).

```
use Fresh\DateTime\DateTimeHelper;

$dateTimeHelper = new DateTimeHelper();

$now = $dateTimeHelper->now(); // \DateTimeImmutable in UTC
```

### Method for getting current timestamp

[](#method-for-getting-current-timestamp)

```
use Fresh\DateTime\DateTimeHelper;

$dateTimeHelper = new DateTimeHelper();

$timestamp = $dateTimeHelper->getCurrentTimestamp();
```

### Method for creating `\DateTime` or `\DateTimeImmutable` from format

[](#method-for-creating-datetime-or-datetimeimmutable-from-format)

```
use Fresh\DateTime\DateTimeHelper;

$dateTimeHelper = new DateTimeHelper();

// By default with format Y-m-d H:i:s and UTC timezone
$dateTime = $dateTimeHelper->createDateTimeFromFormat('2000-01-01 00:00:00');
$dateTimeImmutable = $dateTimeHelper->createDateTimeImmutableFromFormat('2000-01-01 00:00:00');

// With custom format
$dateTime = $dateTimeHelper->createDateTimeFromFormat('01.01.2000 00:00:00', 'd.m.Y H:i:s');

// With custom timezone
$dateTime = $dateTimeHelper->createDateTimeFromFormat('01.01.2000 00:00:00', 'd.m.Y H:i:s', new \DateTimeZone('Europe/Kyiv'));
```

### Method for creating `\DateTimeZone` object

[](#method-for-creating-datetimezone-object)

If you create a `\DateTimeZone` object directly in your code, you will not be able to mock it in tests. So there is a specific method for creating timezone object.

```
use Fresh\DateTime\DateTimeHelper;

$dateTimeHelper = new DateTimeHelper();

$dateTimeZone1 = $dateTimeHelper->createDateTimeZone(); // UTC by default
$dateTimeZone2 = $dateTimeHelper->createDateTimeZone('Europe/Kyiv'); // Or with custom timezone
$dateTimeZone3 = $dateTimeHelper->createDateTimeZoneUtc(); // Another method to get UTC timezone
```

### Immutable `DateRange` ValueObject

[](#immutable-daterange-valueobject)

You often needed to manipulate with since/till dates, so-called date ranges. By its nature, date range is a `ValueObject`, it can be reused many times for different purposes. This library provides a `DateRange` immutable class, which is not able to be changed after its creation. `DateRange` operates only with dates and ignore time.

```
use Fresh\DateTime\DateRange;

$dateRange1 = new DateRange(new \DateTime('yesterday'), new \DateTime('tomorrow'));
$dateRange2 = new DateRange(new \DateTime('yesterday'), new \DateTime('tomorrow', new \DateTimeZone('Europe/Kyiv')));

// There is also the `isEqual` method to compare two DateRange objects.
$dateRange1->isEqual($dateRange2); // Returns FALSE, because date ranges have different timezones
```

### Immutable `DateTimeRange` ValueObject

[](#immutable-datetimerange-valueobject)

This library provides also immutable class `DateTimeRange`, instead of `DateRange` it checks date and time.

```
use Fresh\DateTime\DateTimeRange;

$dateTimeRange1 = new DateTimeRange(new \DateTime('2000-01-01 19:00:00'), new \DateTime('2000-01-01 21:00:00'));
$dateTimeRange2 = new DateTimeRange(new \DateTime('2000-01-01 19:00:00'), new \DateTime('2000-01-01 21:00:00', new \DateTimeZone('Europe/Kyiv')));
$dateTimeRange3 = new DateTimeRange(new \DateTime('2000-01-01 20:00:00'), new \DateTime('2000-01-01 22:00:00'));

// There is also the `isEqual` method to compare two DateTimeRange objects.
$dateTimeRange1->isEqual($dateTimeRange2); // Returns FALSE, because datetime ranges have different timezones

// There is also the `intersects` method to check if datetime range intersected each other.
$dateTimeRange1->intersects($dateTimeRange3); // Returns TRUE, because datetime ranges are intersected
```

#### Examples of date ranges with intersection

[](#examples-of-date-ranges-with-intersection)

[![Example of intersection](docs/images/intersect.png "Example of intersection")](docs/images/intersect.png)

#### Examples of date ranges without intersection

[](#examples-of-date-ranges-without-intersection)

[![Example of no intersection](docs/images/does_not_intersect.png "Example of no intersection")](docs/images/does_not_intersect.png)

### Getting array of objects/strings of all dates in date range

[](#getting-array-of-objectsstrings-of-all-dates-in-date-range)

```
use Fresh\DateTime\DateTimeHelper;
use Fresh\DateTime\DateRange;

$dateTimeHelper = new DateTimeHelper();

$dateRange = new DateRange(new \DateTime('1970-01-01'), new \DateTime('1970-01-03'));

// Creates array with values ['1970-01-01', '1970-01-02', '1970-01-03']
$datesAsStrings = $dateTimeHelper->getDatesFromDateRangeAsArrayOfStrings($dateRange);

// Creates array of \DateTime objects for dates: '1970-01-01', '1970-01-02', '1970-01-03'
$datesAsObjects = $dateTimeHelper->getDatesFromDateRangeAsArrayOfObjects($dateRange);
```

### DateTimeCloner allows to clone dates into `\DateTime` or `\DateTimeImmutable` instances

[](#datetimecloner-allows-to-clone-dates-into-datetime-or-datetimeimmutable-instances)

```
use Fresh\DateTime\DateTimeCloner;

$dateTimeCloner = new DateTimeCloner();

$date1 = new \DateTime();
$dateImmutable1 = $dateTimeCloner::cloneIntoDateTimeImmutable($date1); // Returns \DateTimeImmutable object
$date2 = $dateTimeCloner::cloneIntoDateTime($dateImmutable1); // Returns \DateTime object
```

Contributing 🤝
--------------

[](#contributing-)

See [CONTRIBUTING](https://github.com/fre5h/datetime-php/blob/master/.github/CONTRIBUTING.md) file.

###  Health Score

64

—

FairBetter than 99% of packages

Maintenance85

Actively maintained with recent releases

Popularity47

Moderate usage in the ecosystem

Community16

Small or concentrated contributor base

Maturity87

Battle-tested with a long release history

 Bus Factor1

Top contributor holds 95.7% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~105 days

Recently: every ~126 days

Total

24

Last Release

111d ago

Major Versions

v1.7.0 → v2.0.02021-12-03

v2.0.1 → v3.0.02023-05-16

v3.0.2 → v4.0.02024-09-11

v4.2.0 → v5.0.02025-08-04

PHP version history (6 changes)v1.0.0PHP &gt;=7.1.3

v1.0.1PHP &gt;=7.3.0

v2.0.0PHP &gt;=8.1

v3.0.0PHP &gt;=8.2

v4.0.0PHP &gt;=8.3

v5.0.0PHP &gt;=8.4

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/815865?v=4)[Artem Henvald](/maintainers/fre5h)[@fre5h](https://github.com/fre5h)

---

Top Contributors

[![fre5h](https://avatars.githubusercontent.com/u/815865?v=4)](https://github.com/fre5h "fre5h (90 commits)")[![dependabot[bot]](https://avatars.githubusercontent.com/in/29110?v=4)](https://github.com/dependabot[bot] "dependabot[bot] (2 commits)")[![mackrais](https://avatars.githubusercontent.com/u/8103057?v=4)](https://github.com/mackrais "mackrais (1 commits)")[![rodrigoprimo](https://avatars.githubusercontent.com/u/77215?v=4)](https://github.com/rodrigoprimo "rodrigoprimo (1 commits)")

---

Tags

datedatetimelibrarymidnightphptimetimezonedatetimetimedatetimezonemidnight

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan

Code StylePHP CS Fixer

Type Coverage Yes

### Embed Badge

![Health badge](/badges/fresh-datetime/health.svg)

```
[![Health](https://phpackages.com/badges/fresh-datetime/health.svg)](https://phpackages.com/packages/fresh-datetime)
```

###  Alternatives

[brick/date-time

Date and time library

3623.3M61](/packages/brick-date-time)[league/period

Time range API for PHP

7335.4M21](/packages/league-period)[aeon-php/calendar

PHP type safe, immutable calendar library

2079.7M16](/packages/aeon-php-calendar)[tplaner/when

Date/Calendar recursion library.

5261.0M5](/packages/tplaner-when)[dater/dater

Compact PHP library for working with date/time in different formats &amp; timezones.

14282.3k](/packages/dater-dater)[kartik-v/php-date-formatter

A Javascript datetime formatting and manipulation library using PHP date-time formats.

461.5M3](/packages/kartik-v-php-date-formatter)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
