bitandblack/duration
bitandblack/duration provides a small PHP/Laravel utility for working with time spans: create, parse, and format durations in a readable way, convert between units, and simplify common duration calculations for apps, jobs, and reports.
Strengths:
Carbon and DateTime without redundancy, enabling hybrid approaches (e.g., Carbon::now()->add($duration)).Duration::hours(2)->add(Duration::minutes(30))) improve readability over raw DateInterval or manual calculations.Weaknesses:
strtotime("+1 hour")).DateTime/Carbon for timezone handling, requiring explicit integration.DateInterval in micro-optimized paths (e.g., high-frequency cron jobs).protected $duration as Duration object).delay() method; requires manual conversion to seconds.laravel-schedule (e.g., Schedule::job(Job::class)->every($duration) may need adapters).Carbon, conflicts may arise with nesbot/carbon vs. Laravel’s bundled version.Time facade or Carbon mocking.| Risk Factor | Severity | Mitigation Strategy |
|---|---|---|
| Undiscovered bugs in arithmetic | High | Pilot in a low-criticality feature first. |
| API instability | Medium | Fork the repo to control updates. |
| Performance bottlenecks | Low | Benchmark vs. DateInterval; optimize if needed. |
| Laravel version conflicts | Medium | Test against LTS versions (8.x, 9.x, 10.x). |
| Team adoption resistance | High | Provide migration guides and code examples. |
Carbon/DateInterval in memory usage and speed?Carbon.)spatie/array-to-object, custom classes) that better fit the tech stack?Laravel Ecosystem Synergies:
Duration objects and database storage (e.g., getDurationAttribute(), setDurationAttribute()).
public function getDurationAttribute($value) {
return Duration::fromSeconds($value);
}
Duration::format('H:i:s')).'duration' => ['required', function ($attribute, $value, $fail) {
if (!Duration::isValid($value)) {
$fail('Invalid duration format.');
}
}],
php artisan duration:calculate).traits\MakesHttpRequests, RefreshDatabase).Non-Laravel PHP:
DateTime components and HTTP clients.Assessment Phase (2–4 weeks):
strtotime, DateInterval, manual calculations).Pilot Phase (3–6 weeks):
Duration to Laravel’s container for DI:
$this->app->bind(Duration::class, function () {
return new Duration();
});
Duration facade for cleaner syntax:
use Illuminate\Support\Facades\Facade;
class Duration extends Facade { protected static function getFacadeAccessor() { return 'duration'; } }
Full Adoption (4–8 weeks):
duration_seconds column).Optimization Phase (Ongoing):
Carbon/DateInterval.Duration::hours(1)) if instantiation is costly.nesbot/carbon if needed).Duration vs. App\Duration).Carbon compatibility.Phase 1: Core Integration (2 weeks)
Phase 2: Feature-Specific Adoption (3–4 weeks)
Phase 3: Global Standardization (4–6 weeks)
Phase 4: Optimization (Ongoing)
Carbon/DateInterval.How can I help you explore Laravel packages today?