danharrin/date-format-converter
Convert date/time format strings between PHP, Moment.js, ICU and more. Handy for Laravel apps that need consistent formatting across backend and frontend, with simple helpers to translate patterns and reduce duplicated format definitions.
Installation
composer require danharrin/date-format-converter
No configuration is required—just autoload the package.
First Use Case: Convert a Date String
use DanHarrin\DateFormatConverter\Converter;
$converter = new Converter();
$converted = $converter->convert('2024-06-13', 'Y-m-d', 'd/m/Y');
// Output: "13/06/2024"
Where to Look First
Converter class: Core functionality for format conversions.Converter::convert(): Primary method for token-based conversions.Converter::getFormat(): Extract tokens from a format string (e.g., 'Y-m-d' → ['Y', 'm', 'd']).Converter::getDate(): Parse a date string into a DateTime object.Dynamic Format Handling Useful for user-submitted formats (e.g., CMS or API inputs):
$userFormat = request('date_format'); // e.g., "MM/DD/YYYY"
$converter->convert($dateString, 'Y-m-d', $userFormat);
Batch Processing Convert arrays of dates efficiently:
$dates = ['2024-01-01', '2024-02-01'];
$formatted = array_map(
fn($date) => $converter->convert($date, 'Y-m-d', 'Y.m.d'),
$dates
);
// Output: ["2024.01.01", "2024.02.01"]
Integration with Laravel
public function rules()
{
return ['date' => 'required|date_format:Y-m-d'];
}
$carbon = Carbon::parse('2024-06-13');
$converted = $converter->convert($carbon->format('Y-m-d'), 'Y-m-d', 'd/m/Y');
Localization
Handle locale-specific formats (e.g., German d.m.Y):
$converter->convert('2024-06-13', 'Y-m-d', 'd.m.Y'); // "13.06.2024"
Custom Token Support
Extend the converter for non-standard tokens (e.g., Q for quarter):
$converter->addToken('Q', fn(DateTime $date) => $date->format('Q'));
$converter->convert('2024-06-13', 'Y-m-d', 'Y-Q'); // "2024-2"
Fallback Formats Handle ambiguous inputs gracefully:
try {
$converted = $converter->convert('06/13/2024', 'm/d/Y', 'd/m/Y');
} catch (InvalidArgumentException $e) {
// Fallback to default parsing
}
Testing
Mock the Converter in unit tests:
$converter = $this->createMock(Converter::class);
$converter->method('convert')
->with('2024-06-13', 'Y-m-d', 'd/m/Y')
->willReturn('13/06/2024');
Token Mismatches
convert('2024-06-13', 'Y-m-d', 'd-m-Y') may fail if the input doesn’t match the source format.getDate() first:
$date = $converter->getDate('2024-06-13', 'Y-m-d');
$converted = $date->format('d-m-Y');
Timezone Sensitivity
DateTime objects respect the system timezone. Use setTimezone() if needed:
$date = $converter->getDate('2024-06-13', 'Y-m-d');
$date->setTimezone(new DateTimeZone('UTC'));
Locale-Specific Parsing
d/m/Y) may parse incorrectly in non-English locales.DateTime:
$date = DateTime::createFromFormat('d/m/Y', '13/06/2024', new DateTimeZone('en_GB'));
Edge Cases in Tokens
DateTime edge cases (e.g., invalid dates).try-catch:
$converter->addToken('week', fn(DateTime $date) => {
try {
return $date->format('W');
} catch (Exception $e) {
return '0';
}
});
Inspect Tokens
Use getFormat() to debug token extraction:
print_r($converter->getFormat('Y-m-d H:i:s')); // ['Y', 'm', 'd', 'H', 'i', 's']
Log Conversions Add logging for troubleshooting:
$converter->convert('2024-06-13', 'Y-m-d', 'd/m/Y', true); // Enable debug mode
Fallback to Carbon For complex cases, leverage Carbon’s parsing:
$date = Carbon::createFromFormat('Y-m-d', '2024-06-13');
$converted = $date->format('d/m/Y');
Custom Token Registry
Override the default tokens by extending the Converter class:
class CustomConverter extends Converter {
public function __construct() {
$this->addToken('custom', fn(DateTime $date) => 'CUSTOM');
}
}
Integration with Laravel Helpers Create a global helper:
if (!function_exists('convert_date')) {
function convert_date(string $date, string $from, string $to): string {
return app(Converter::class)->convert($date, $from, $to);
}
}
Usage:
convert_date('2024-06-13', 'Y-m-d', 'd/m/Y');
Service Provider Binding Bind the converter to Laravel’s container for dependency injection:
// app/Providers/AppServiceProvider.php
public function register() {
$this->app->bind(Converter::class, fn() => new Converter());
}
Usage in controllers:
public function __construct(private Converter $converter) {}
How can I help you explore Laravel packages today?