Carbon create from timestamp
Stefan Bogdanescu
Founder & Senior Architect · 2026-06-29
Mastering Timestamps: Converting Unix Epochs to Carbon Dates in Laravel
As developers working within the Laravel ecosystem, we frequently deal with dates and times. Whether we are parsing standard SQL date strings or dealing with raw Unix timestamps from databases, converting these values into usable, human-readable formats is a fundamental skill. When using the powerful Carbon library—Laravel’s dependency for handling dates—this conversion becomes straightforward, but sometimes, subtle data type mismatches can lead to cryptic errors.
This post addresses a common stumbling block: converting Unix timestamps stored in your database columns into meaningful Carbon date objects. We will dissect why you might be encountering errors and provide the most robust solution.
The Challenge with Timestamp Conversion
You are attempting to convert a value, which represents a Unix timestamp (the number of seconds elapsed since January 1, 1970), into a readable date using Carbon::createFromTimestamp().
Your attempt looked like this:
{{ Carbon\Carbon::createFromTimestamp($post->created_at)->toDateTimeString() }}And you received the error: "Error - A non well formed numeric value encountered."
This error typically signals that the input provided to the function is not a valid numeric type (integer or float), even though it looks like a number. In the context of database interaction, this often happens when data types are mismatched, or when Eloquent/PHP attempts an implicit cast on a value stored as a string that contains non-numeric characters, or if the retrieval process fails to extract the raw integer correctly before passing it to Carbon.
The Developer Solution: Ensuring Numeric Integrity
The key to solving this lies in ensuring that the value being passed to createFromTimestamp() is strictly an integer representing the timestamp. If your database column stores timestamps as a standard Unix epoch integer, the issue usually stems from how PHP or Eloquent retrieves that data.
Before calling any Carbon method on it, we must explicitly cast the value to an integer to eliminate any ambiguity. This practice ensures that Carbon receives exactly what it expects: a valid numeric timestamp.
Here is the corrected and most reliable approach:
use Carbon\Carbon;
// Assuming $post->created_at holds the Unix timestamp (e.g., 1493637826)
$timestamp = (int) $post->created_at;
try {
$date = Carbon::createFromTimestamp($timestamp);
echo $date->toDateTimeString();
} catch (\Exception $e) {
// Handle cases where the timestamp might be invalid or zero
echo "Error creating date: " . $e->getMessage();
}Why This Works
By explicitly casting $post->created_at to (int), we force PHP to treat the retrieved value purely as a numeric integer. This bypasses any potential string parsing issues that might have caused the previous error, ensuring that Carbon::createFromTimestamp() receives the clean, well-formed numeric value it requires.
For robust data handling in Laravel projects, always prioritize explicit type casting when dealing with database values, especially those representing numerical epochs or dates. This aligns perfectly with the principle of writing clean, predictable code, which is central to how we approach development at https://laravelcompany.com.
Comparing String vs. Timestamp Handling
It's important to contrast this with your initial successful method:
- String Dates (Standard): If your column stores dates in a standard SQL format (like
YYYY-MM-DD HH:MM:SS), Eloquent and Carbon handle the parsing automatically, as seen when you used$post->created_atdirectly. - Unix Timestamps (Epoch): If the column stores the raw integer epoch time, you must explicitly tell Carbon how to interpret that number using
createFromTimestamp(), ensuring the input is purely numeric.
Conclusion
Converting data types correctly is a hallmark of senior-level development. The error you encountered was not an issue with the Carbon function itself, but rather an issue with the integrity of the input data being passed into it. By enforcing type casting—specifically converting the database value to an integer before using Carbon::createFromTimestamp()—you ensure reliability and eliminate those frustrating "non well formed numeric value" errors. Master these small details, and you can build significantly more robust applications.