Timestamp Best Practices for Web Development
Timestamp Best Practices
Handling time correctly is one of the trickiest parts of software development. Follow these best practices to avoid common pitfalls.
1. Store in UTC
Always store timestamps in UTC (Coordinated Universal Time):
``javascript
// Good: Store UTC timestamp
const utcTimestamp = Date.now();
database.save({ created_at: utcTimestamp });
// Bad: Store local time
const localTime = new Date().toString(); // Includes timezone
`
Benefits:
- Consistent across servers worldwide
- No daylight saving time issues
- Easy to convert to any local time
2. Use Integers, Not Strings
Store timestamps as integers, not formatted strings:
`sql
-- Good
created_at BIGINT NOT NULL
-- Bad
created_at VARCHAR(50)
`
Benefits:
- Smaller storage size
- Faster comparisons and sorting
- No parsing errors
3. Display in User's Local Time
Convert to local time only when displaying to users:
`javascript
// API returns UTC timestamp
const apiTimestamp = 1735689600000;
// Convert for display
const localDate = new Date(apiTimestamp);
const displayString = localDate.toLocaleString();
`
4. Be Explicit About Units
Always document whether you're using seconds or milliseconds:
`typescript
interface ApiResponse {
// Unix timestamp in seconds
created_at: number;
// Unix timestamp in milliseconds
updated_at_ms: number;
}
`
5. Handle Time Zones Carefully
When accepting user input, be clear about time zones:
`javascript
// Parse with explicit timezone
const userDate = new Date('2025-01-15T10:00:00-05:00'); // EST
// Or parse as UTC
const utcDate = new Date('2025-01-15T15:00:00Z');
`
6. Use Libraries for Complex Operations
For complex date manipulation, use established libraries:
`javascript
// date-fns
import { addDays, format } from 'date-fns';
const nextWeek = addDays(new Date(), 7);
// dayjs
import dayjs from 'dayjs';
const formatted = dayjs().format('YYYY-MM-DD');
`
7. Validate Timestamp Ranges
Always validate timestamp inputs:
`javascript
function isValidTimestamp(ts) {
// Check reasonable range (1970 to 2100)
const minTs = 0;
const maxTs = 4102444800; // 2100-01-01
return Number.isInteger(ts) && ts >= minTs && ts <= maxTs;
}
``
8. Consider Precision Needs
Choose appropriate precision for your use case:
- Seconds: Most timestamps, expiration times
- Milliseconds: Performance metrics, animations
- Microseconds: High-frequency trading, scientific data
9. Handle Leap Seconds
Unix timestamps don't account for leap seconds. For most applications, this doesn't matter, but be aware if you need extreme precision.
10. Test Edge Cases
Always test with:
- Daylight saving time transitions
- Year boundaries
- Different time zones
- The Unix epoch (timestamp 0)
- Future dates