244 lines
4.6 KiB
Markdown
244 lines
4.6 KiB
Markdown
Here is a cleaned up, expanded, and more production-ready version of your **date and time manipulation** document, written from a DevOps / Linux system administration perspective and keeping it concise and accurate.
|
||
|
||
---
|
||
|
||
# Essential Date and Time Manipulation Commands
|
||
|
||
This document covers common shell commands for working with dates and times. These commands are frequently used in scripting, logging, monitoring, automation, and system administration tasks.
|
||
|
||
---
|
||
|
||
## 1. The `date` Command Overview
|
||
|
||
The `date` command is a standard Unix/Linux utility used to:
|
||
|
||
* Display the current system date and time
|
||
* Format timestamps
|
||
* Convert between human-readable dates and Unix epoch time
|
||
* Perform date arithmetic
|
||
|
||
Check system time:
|
||
|
||
```bash
|
||
date
|
||
```
|
||
|
||
---
|
||
|
||
## 2. Creating Epoch Timestamps
|
||
|
||
### Current Epoch Time (Seconds)
|
||
|
||
```bash
|
||
date +%s
|
||
```
|
||
|
||
Output example:
|
||
|
||
```
|
||
1737154200
|
||
```
|
||
|
||
### Current Epoch Time (Milliseconds)
|
||
|
||
```bash
|
||
date +%s%3N
|
||
```
|
||
|
||
Notes:
|
||
|
||
* `%s` → seconds since Unix epoch
|
||
* `%3N` → milliseconds (GNU date only)
|
||
|
||
---
|
||
|
||
### Convert Specific Date to Epoch (Milliseconds)
|
||
|
||
Convert a human-readable date to epoch time:
|
||
|
||
```bash
|
||
date -d "2026-01-13 14:31:26" +%s%3N
|
||
```
|
||
|
||
Common use cases:
|
||
|
||
* Log correlation
|
||
* API timestamps
|
||
* CI/CD pipeline timing
|
||
* Monitoring and alerting
|
||
|
||
---
|
||
|
||
## 3. Formatting Current Date and Time
|
||
|
||
Custom output formats are widely used in scripts and logs.
|
||
|
||
### Common Date Formats
|
||
|
||
| Command | Description | Example Output |
|
||
| --------------------------- | --------------------- | ---------------------------- |
|
||
| `date` | Default system format | Wed Jan 17 10:30:00 UTC 2026 |
|
||
| `date +'%Y-%m-%d %H:%M:%S'` | ISO-like format | 2026-01-17 10:30:00 |
|
||
| `date +'%Y-%m-%d'` | Date only | 2026-01-17 |
|
||
| `date +'%H:%M:%S'` | Time only | 10:30:00 |
|
||
| `date +%s` | Epoch (seconds) | 1737154200 |
|
||
|
||
### Common Format Specifiers
|
||
|
||
| Specifier | Meaning |
|
||
| --------- | --------------- |
|
||
| `%Y` | Year (4 digits) |
|
||
| `%m` | Month (01–12) |
|
||
| `%d` | Day (01–31) |
|
||
| `%H` | Hour (00–23) |
|
||
| `%M` | Minute (00–59) |
|
||
| `%S` | Second (00–60) |
|
||
| `%N` | Nanoseconds |
|
||
|
||
---
|
||
|
||
## 4. Converting Epoch to Human-Readable Time
|
||
|
||
Convert epoch seconds to readable format:
|
||
|
||
```bash
|
||
date -d @1737154200
|
||
```
|
||
|
||
Using a variable:
|
||
|
||
```bash
|
||
EPOCH_TIME=1737154200
|
||
date -d @"$EPOCH_TIME"
|
||
```
|
||
|
||
Formatted output:
|
||
|
||
```bash
|
||
date -d @"$EPOCH_TIME" '+%Y-%m-%d %H:%M:%S'
|
||
```
|
||
|
||
---
|
||
|
||
## 5. Date Arithmetic
|
||
|
||
GNU `date` supports flexible date calculations.
|
||
|
||
### Relative Dates
|
||
|
||
| Command | Description |
|
||
| ----------------------- | ----------------------- |
|
||
| `date -d "yesterday"` | Previous day |
|
||
| `date -d "tomorrow"` | Next day |
|
||
| `date -d "2 days ago"` | Two days in the past |
|
||
| `date -d "+1 hour"` | One hour from now |
|
||
| `date -d "+30 minutes"` | Thirty minutes from now |
|
||
| `date -d "+1 week"` | One week from now |
|
||
| `date -d "2 weeks ago"` | Two weeks ago |
|
||
|
||
---
|
||
|
||
## 6. Date Arithmetic with Formatting
|
||
|
||
Example: date 7 days from now:
|
||
|
||
```bash
|
||
date -d "+7 days" '+%Y-%m-%d'
|
||
```
|
||
|
||
Example: timestamp 15 minutes ago (epoch):
|
||
|
||
```bash
|
||
date -d "-15 minutes" +%s
|
||
```
|
||
|
||
---
|
||
|
||
## 7. Working with UTC and Time Zones
|
||
|
||
Display current UTC time:
|
||
|
||
```bash
|
||
date -u
|
||
```
|
||
|
||
Format UTC time:
|
||
|
||
```bash
|
||
date -u '+%Y-%m-%d %H:%M:%S'
|
||
```
|
||
|
||
Convert date in a specific timezone:
|
||
|
||
```bash
|
||
TZ=UTC date
|
||
TZ=America/New_York date
|
||
```
|
||
|
||
---
|
||
|
||
## 8. Script-Friendly Usage Examples
|
||
|
||
Add timestamp to a log entry:
|
||
|
||
```bash
|
||
echo "$(date '+%Y-%m-%d %H:%M:%S') Application started"
|
||
```
|
||
|
||
Generate a timestamped filename:
|
||
|
||
```bash
|
||
backup_$(date +%Y%m%d_%H%M%S).tar.gz
|
||
```
|
||
|
||
Measure execution time:
|
||
|
||
```bash
|
||
start=$(date +%s)
|
||
# command here
|
||
end=$(date +%s)
|
||
echo "Duration: $((end - start)) seconds"
|
||
```
|
||
|
||
---
|
||
|
||
## 9. macOS Compatibility Notes
|
||
|
||
macOS uses BSD `date`, which differs from GNU `date`.
|
||
|
||
Example difference:
|
||
|
||
```bash
|
||
# GNU (Linux)
|
||
date -d "yesterday"
|
||
|
||
# BSD (macOS)
|
||
date -v -1d
|
||
```
|
||
|
||
Install GNU date on macOS:
|
||
|
||
```bash
|
||
brew install coreutils
|
||
gdate -d "yesterday"
|
||
```
|
||
|
||
---
|
||
|
||
## 10. Best Practices
|
||
|
||
* Use UTC for logs and distributed systems
|
||
* Store timestamps as epoch values when possible
|
||
* Format dates only at display time
|
||
* Avoid locale-dependent formats in scripts
|
||
* Be aware of GNU vs BSD `date` differences
|
||
|
||
---
|
||
|
||
If you want, I can:
|
||
|
||
* Add cron-specific date examples
|
||
* Add log rotation and backup use cases
|
||
* Provide a quick-reference cheat sheet
|
||
* Add cross-platform date handling strategies
|