Parsing & Formatting Guide¶
Comprehensive guide to parsing datetime strings and formatting datetime objects in Carbonic.
Overview¶
Carbonic provides flexible parsing and formatting capabilities: - Automatic parsing for common formats (ISO 8601, etc.) - Custom format parsing using strftime or Carbon-style tokens - Rich formatting options with Carbon-style tokens - Locale-aware formatting for international applications
Parsing DateTime Strings¶
Automatic Parsing¶
Carbonic automatically detects and parses common datetime formats:
from carbonic import DateTime
# ISO 8601 formats (recommended)
dt1 = DateTime.parse("2024-01-15T14:30:45+00:00") # With timezone
dt2 = DateTime.parse("2024-01-15T14:30:45Z") # UTC (Z suffix)
dt3 = DateTime.parse("2024-01-15T14:30:45") # Naive (defaults to UTC)
# Date only (time defaults to 00:00:00)
dt4 = DateTime.parse("2024-01-15") # 2024-01-15T00:00:00+00:00
# Common variations
dt5 = DateTime.parse("2024-01-15 14:30:45") # Space separator
Parsing with Explicit Formats¶
For non-standard formats, specify the format explicitly:
from carbonic import DateTime
# Using strftime format codes
dt1 = DateTime.parse("15/01/2024 14:30:45", "%d/%m/%Y %H:%M:%S")
dt2 = DateTime.parse("Jan 15, 2024 2:30 PM", "%b %d, %Y %I:%M %p")
# Using Carbon-style format tokens
dt3 = DateTime.parse("15-01-2024 14:30:45", "d-m-Y H:i:s")
dt4 = DateTime.parse("15 January 2024", "j F Y")
Parsing with Timezone¶
from carbonic import DateTime
# Parse and apply specific timezone
dt1 = DateTime.parse("2024-01-15 14:30:45", tz="Europe/Warsaw")
dt2 = DateTime.parse("15/01/2024 14:30", "%d/%m/%Y %H:%M", tz="America/New_York")
# Parse with timezone in the string
dt3 = DateTime.parse("2024-01-15T14:30:45+01:00") # Preserves timezone info
Parsing Date Strings¶
from carbonic import Date
# Automatic parsing
date1 = Date.parse("2024-01-15") # ISO format
# With explicit format
date2 = Date.parse("2024/01/15", "%Y/%m/%d") # Slash format with explicit format
date3 = Date.parse("15-01-2024", "d-m-Y") # European format with explicit format
date4 = Date.parse("Jan 15, 2024", "%b %d, %Y")
date5 = Date.parse("15 January 2024", "j F Y") # Carbon format
Error Handling¶
from carbonic import DateTime
from carbonic.core.exceptions import ParseError
try:
dt = DateTime.parse("invalid-date-string")
except ParseError as e:
print(f"Parsing failed: {e}")
try:
dt = DateTime.parse("2024-01-15", "%Y/%m/%d") # Wrong format
except ParseError as e:
print(f"Format mismatch: {e}")
Formatting DateTime Objects¶
Carbon-Style Formatting¶
Carbonic uses Carbon-inspired format tokens for flexible formatting:
from carbonic import DateTime
dt = DateTime(2024, 1, 15, 14, 30, 45)
# Date components
print(dt.format("Y-m-d")) # 2024-01-15
print(dt.format("d/m/Y")) # 15/01/2024
print(dt.format("j F Y")) # 15 January 2024
print(dt.format("l, jS F Y")) # Monday, 15th January 2024
# Time components
print(dt.format("H:i:s")) # 14:30:45
print(dt.format("h:i A")) # 02:30 PM
print(dt.format("g:i a")) # 2:30 pm
# Combined formats
print(dt.format("Y-m-d H:i:s")) # 2024-01-15 14:30:45
print(dt.format("l, F j, Y \\a\\t g:i A")) # Monday, January 15, 2024 at 2:30 PM
Format Token Reference¶
Date Tokens¶
| Token | Description | Example |
|---|---|---|
Y |
4-digit year | 2024 |
y |
2-digit year | 24 |
m |
Month with leading zero | 01-12 |
n |
Month without leading zero | 1-12 |
F |
Full month name | January |
M |
Short month name | Jan |
d |
Day with leading zero | 01-31 |
j |
Day without leading zero | 1-31 |
S |
Ordinal suffix | st, nd, rd, th |
l |
Full day name | Monday |
D |
Short day name | Mon |
Time Tokens¶
| Token | Description | Example |
|---|---|---|
H |
24-hour with leading zero | 00-23 |
G |
24-hour without leading zero | 0-23 |
h |
12-hour with leading zero | 01-12 |
g |
12-hour without leading zero | 1-12 |
i |
Minutes with leading zero | 00-59 |
s |
Seconds with leading zero | 00-59 |
A |
Uppercase AM/PM | AM, PM |
a |
Lowercase am/pm | am, pm |
u |
Microseconds | 000000-999999 |
v |
Milliseconds | 000-999 |
Timezone Tokens¶
| Token | Description | Example |
|---|---|---|
T |
Timezone abbreviation | UTC, EST |
O |
Timezone offset | +0000, -0500 |
P |
Timezone offset with colon | +00:00, -05:00 |
Z |
Timezone offset in seconds | 0, -18000 |
Special Tokens¶
| Token | Description | Example |
|---|---|---|
c |
ISO 8601 format | 2024-01-15T14:30:45+00:00 |
r |
RFC 2822 format | Mon, 15 Jan 2024 14:30:45 +0000 |
Escaping Tokens¶
To include literal characters that would otherwise be interpreted as tokens:
from carbonic import DateTime
dt = DateTime(2024, 1, 15, 14, 30, 45)
# Escape tokens with curly braces
print(dt.format("{Y} = Y")) # Y = 2024
print(dt.format("Year: {Y}Y")) # Year: Y2024
print(dt.format("{H}:{i} means H:i")) # H:i means 14:30
# Use Python string literals for special characters
print(dt.format("Y-m-d\nH:i:s")) # 2024-01-15\n14:30:45
Built-in Format Methods¶
from carbonic import DateTime
dt = DateTime(2024, 1, 15, 14, 30, 45, 123456)
# Common formats
print(dt.to_iso_string()) # 2024-01-15T14:30:45.123456+00:00
print(dt.to_date_string()) # 2024-01-15
print(dt.to_time_string()) # 14:30:45
print(dt.to_datetime_string()) # 2024-01-15 14:30:45
# Web formats
print(dt.to_atom_string()) # 2024-01-15T14:30:45+00:00
print(dt.to_cookie_string()) # Mon, 15-Jan-2024 14:30:45 UTC
strftime Compatibility¶
from carbonic import DateTime
dt = DateTime(2024, 1, 15, 14, 30, 45)
# Standard strftime
print(dt.strftime("%Y-%m-%d %H:%M:%S")) # 2024-01-15 14:30:45
print(dt.strftime("%A, %B %d, %Y")) # Monday, January 15, 2024
# Python format protocol
print(f"{dt:%Y-%m-%d}") # 2024-01-15
print(format(dt, "%A, %B %d")) # Monday, January 15
Formatting Date Objects¶
from carbonic import Date
date = Date(2024, 1, 15)
# Carbon format
print(date.format("Y-m-d")) # 2024-01-15
print(date.format("l, F j, Y")) # Monday, January 15, 2024
print(date.format("d/m/y")) # 15/01/24
# Built-in formats
print(date.to_iso_string()) # 2024-01-15
print(str(date)) # 2024-01-15
# strftime
print(date.strftime("%B %d, %Y")) # January 15, 2024
Locale-Aware Formatting¶
from carbonic import DateTime
dt = DateTime(2024, 1, 15, 14, 30, 45)
# Different locales
print(dt.format("l, F j, Y", locale="en")) # Monday, January 15, 2024
print(dt.format("l, j F Y", locale="pl")) # poniedziałek, 15 stycznia 2024
print(dt.format("l, j {d}e F {d}e Y", locale="es")) # lunes, 15 de enero de 2024
print(dt.format("l j F Y", locale="fr")) # lundi 15 janvier 2024
Performance Considerations¶
Parsing Performance¶
from carbonic import DateTime
# Fastest: ISO format auto-detection
dt1 = DateTime.parse("2024-01-15T14:30:45+00:00")
# Slower: Custom format parsing
dt2 = DateTime.parse("15/01/2024 14:30:45", "%d/%m/%Y %H:%M:%S")
# Optional: Use ciso8601 for faster ISO parsing (install separately)
# pip install carbonic[performance]
Formatting Performance¶
from carbonic import DateTime
dt = DateTime(2024, 1, 15, 14, 30, 45)
# Fast: Built-in methods
iso_string = dt.to_iso_string()
# Moderate: Simple format strings
date_string = dt.format("Y-m-d")
# Slower: Complex format strings with locale
complex_string = dt.format("l, jS F Y", locale="pl")
Common Patterns¶
API Integration¶
from carbonic import DateTime
import json
# Parse API responses
api_response = {"created_at": "2024-01-15T14:30:45Z"}
created = DateTime.parse(api_response["created_at"])
# Format for API requests
request_data = {
"start_date": created.to_iso_string(),
"end_date": created.add(days=7).to_iso_string()
}
User-Friendly Display¶
from carbonic import DateTime
dt = DateTime(2024, 1, 15, 14, 30, 45)
def format_for_user(dt, user_locale="en"):
"""Format datetime for user display based on locale."""
if user_locale == "en":
return dt.format("l, F j, Y \\a\\t g:i A") # Monday, January 15, 2024 at 2:30 PM
elif user_locale == "pl":
return dt.format("l, j F Y o G:i") # poniedziałek, 15 stycznia 2024 o 14:30
else:
return dt.to_iso_string()
print(format_for_user(dt, "en")) # Monday, January 15, 2024 at 2:30 PM
print(format_for_user(dt, "pl")) # poniedziałek, 15 stycznia 2024 o 14:30
Log Formatting¶
from carbonic import DateTime
def create_log_entry(message, level="INFO"):
"""Create a log entry with timestamp."""
timestamp = DateTime.now().format("Y-m-d H:i:s.v")
return f"[{timestamp}] {level}: {message}"
print(create_log_entry("Application started"))
# [2024-01-15 14:30:45.123] INFO: Application started
See Also¶
- DateTime Guide - Complete DateTime reference
- Date Guide - Date formatting and parsing
- Localization Guide - Multi-language formatting
- API Reference - Complete formatting API