php-standard-library/date-time
Immutable, timezone-aware DateTime types for PHP. Provides Duration, Period, and Interval helpers for safer date/time arithmetic and ranges, designed as a standard-library style package with clear docs and contribution links.
Installation
composer require php-standard-library/date-time
Add to composer.json under require or require-dev if needed.
First Use Case: Immutable DateTime Creation
use PhpStandardLibrary\DateTime\DateTime;
$date = DateTime::fromIsoString('2026-05-23T12:00:00+00:00');
echo $date->format('Y-m-d H:i:s'); // Outputs: 2026-05-23 12:00:00
Key Classes to Explore
DateTime (immutable, timezone-aware)Duration (e.g., Duration::days(5))Period (e.g., Period::months(3))Interval (e.g., Interval::fromStartEnd($start, $end))Where to Look First
tests/ directory for usage examples and edge casesuse PhpStandardLibrary\DateTime\DateTime;
// Create a timezone-aware DateTime
$now = DateTime::now('America/Chicago');
// Convert to another timezone
$utcTime = $now->inTimezone('UTC');
// Format with timezone
echo $now->format('Y-m-d H:i:sP'); // e.g., 2026-05-23 12:00:00-05:00
use PhpStandardLibrary\DateTime\Duration;
use PhpStandardLibrary\DateTime\Period;
$date = DateTime::fromIsoString('2026-05-23T12:00:00+00:00');
// Add a duration (immutable)
$futureDate = $date->add(Duration::days(7));
// Subtract a period (immutable)
$pastDate = $date->subtract(Period::months(2));
use PhpStandardLibrary\DateTime\Interval;
$start = DateTime::fromIsoString('2026-01-01T00:00:00+00:00');
$end = DateTime::fromIsoString('2026-01-31T23:59:59+00:00');
$interval = Interval::fromStartEnd($start, $end);
echo $interval->days(); // Outputs: 31
use PhpStandardLibrary\DateTime\Duration;
$start = DateTime::fromIsoString('2026-05-23T10:00:00+00:00');
$end = DateTime::fromIsoString('2026-05-23T12:30:00+00:00');
$duration = $start->diff($end);
echo $duration->hours(); // Outputs: 2.5
use PhpStandardLibrary\DateTime\Period;
$period = Period::months(3); // 3 months
$nextDate = $date->add($period);
use Illuminate\Database\Eloquent\Model;
use PhpStandardLibrary\DateTime\DateTime;
class Event extends Model
{
protected $casts = [
'starts_at' => DateTime::class,
'ends_at' => DateTime::class,
];
}
use Illuminate\Validation\Rule;
use PhpStandardLibrary\DateTime\Duration;
$validator = Validator::make($request->all(), [
'due_date' => [
'required',
Rule::function('due_date', function ($attribute, $value, $fail) {
$dueDate = DateTime::fromIsoString($value);
$minDuration = Duration::days(7);
if ($dueDate->subtract($minDuration)->isBefore(DateTime::now())) {
$fail('Due date must be at least 7 days from now.');
}
}),
],
]);
$date = DateTime::now();
$date->add(Duration::days(1)); // Doesn't modify $date!
$date = $date->add(Duration::days(1)); // Correct
DateTime::now() defaults to UTC, unlike Carbon which uses the system timezone.
$date = DateTime::now(); // UTC by default
$date = DateTime::now('America/New_York'); // Explicit timezone
DateTime objects may not serialize/deserialize correctly in JSON APIs.
$date = DateTime::now();
json_encode($date); // May throw an error
toIsoString() or implement JsonSerializable.
$date->toIsoString(); // "2026-05-23T12:00:00+00:00"
add() and subtract() take Duration/Period objects, not raw values.
$date->add(7); // Error!
$date->add(Duration::days(7)); // Correct
Duration or Period objects.DateTime objects out of the box.
$model->date = DateTime::now(); // May not save correctly
protected $casts = [
'date' => DateTime::class,
];
DateTime::now('UTC'); // Explicit timezone
Carbon, this library does not provide backward compatibility. Avoid mixing Carbon and DateTime objects in the same logic.Carbon, this library does not have a parse() method. Use fromFormat() or fromIsoString() instead.DateTime::fromFormat('Y-m-d', '2026-05-23');
DateTime::fromIsoString('2026-05-23T12:00:00+00:00');
class CustomDateFormatter
{
public static function formatForAPI(DateTime $date): string
{
return $date->format('Y-m-d\TH:i:s.vP');
}
}
Carbon).class DateTimeToCarbonAdapter
{
public static function adapt(DateTime $date): Carbon\Carbon
{
return Carbon\Carbon::instance($date);
}
}
use Illuminate\Validation\
How can I help you explore Laravel packages today?