# OS Time
_Path: en/lua/system/ostime_
## Table of Contents
- OS Time
## Content
# OS Time
Standard Lua `os` time functions. Provides real wall-clock time for timestamps, date formatting, and time calculations.
## Loading
Global `os` table. No require needed.
```lua
os.time()
os.date()
os.clock()
os.difftime()
```
## Getting Timestamps
Get Unix timestamp (seconds since Jan 1, 1970 UTC):
```lua
-- Current timestamp
local now = os.time() -- 1718462445
-- Specific date/time
local t = os.time({
year = 2024,
month = 12,
day = 25,
hour = 10,
min = 30,
sec = 0
})
```
**Signature:** `os.time([spec]) -> integer`
**Parameters:**
| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `year` | integer | current year | Four-digit year (e.g., 2024) |
| `month` | integer | current month | Month 1-12 |
| `day` | integer | current day | Day of month 1-31 |
| `hour` | integer | 0 | Hour 0-23 |
| `min` | integer | 0 | Minute 0-59 |
| `sec` | integer | 0 | Second 0-59 |
When called with no arguments, returns current Unix timestamp.
When called with a table, any missing field uses defaults shown above. The `year`, `month`, and `day` fields default to current date if not specified.
```lua
-- Just date (time defaults to midnight)
os.time({year = 2024, month = 6, day = 15})
-- Partial (fills in current year/month)
os.time({day = 1}) -- first of current month
```
## Formatting Dates
Format a timestamp as string or return a date table:
local now = os.time()
-- Default format
os.date() -- "Sat Jun 15 14:30:45 2024"
-- Custom format
os.date("%Y-%m-%d", now) -- "2024-06-15"
os.date("%H:%M:%S", now) -- "14:30:45"
os.date("%Y-%m-%dT%H:%M:%S", now) -- "2024-06-15T14:30:45"
-- UTC time (prefix format with !)
os.date("!%Y-%m-%d %H:%M:%S", now) -- UTC instead of local
-- Date table
local t = os.date("*t", now)
**Signature:** `os.date([format], [timestamp]) -> string | table`
| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `format` | string | `"%c"` | Format string, `"*t"` for table |
| `timestamp` | integer | current time | Unix timestamp to format |
### Format Specifiers
| Code | Output | Example |
|------|--------|---------|
| `%Y` | 4-digit year | 2024 |
| `%y` | 2-digit year | 24 |
| `%m` | Month (01-12) | 06 |
| `%d` | Day (01-31) | 15 |
| `%H` | Hour 24h (00-23) | 14 |
| `%I` | Hour 12h (01-12) | 02 |
| `%M` | Minute (00-59) | 30 |
| `%S` | Second (00-59) | 45 |
| `%p` | AM/PM | PM |
| `%A` | Weekday name | Saturday |
| `%a` | Weekday short | Sat |
| `%B` | Month name | June |
| `%b` | Month short | Jun |
| `%w` | Weekday (0-6, Sunday=0) | 6 |
| `%j` | Day of year (001-366) | 167 |
| `%U` | Week number (00-53) | 24 |
| `%z` | Timezone offset | -0700 |
| `%Z` | Timezone name | PDT |
| `%c` | Full date/time | Sat Jun 15 14:30:45 2024 |
| `%x` | Date only | 06/15/24 |
| `%X` | Time only | 14:30:45 |
| `%%` | Literal % | % |
### Date Table
When format is `"*t"`, returns a table:
```lua
local t = os.date("*t")
```
| Field | Type | Description | Example |
|-------|------|-------------|---------|
| `year` | integer | Four-digit year | 2024 |
| `month` | integer | Month (1-12) | 6 |
| `day` | integer | Day of month (1-31) | 15 |
| `hour` | integer | Hour (0-23) | 14 |
| `min` | integer | Minute (0-59) | 30 |
| `sec` | integer | Second (0-59) | 45 |
| `wday` | integer | Weekday (1-7, Sunday=1) | 7 |
| `yday` | integer | Day of year (1-366) | 167 |
| `isdst` | boolean | Daylight saving time | false |
Use `"!*t"` for UTC date table.
## Measuring Elapsed Time
Get seconds elapsed since Lua runtime started:
```lua
local start = os.clock()
-- do work
for i = 1, 1000000 do end
local elapsed = os.clock() - start
print(string.format("Took %.3f seconds", elapsed))
```
**Signature:** `os.clock() -> number`
## Time Difference
Get difference between two timestamps in seconds:
```lua
local t1 = os.time({year = 2024, month = 1, day = 1})
local t2 = os.time({year = 2024, month = 12, day = 31})
local diff = os.difftime(t2, t1) -- t2 - t1
local days = diff / 86400
print(days) -- 365
```
**Signature:** `os.difftime(t2, t1) -> number`
| Parameter | Type | Description |
|-----------|------|-------------|
| `t2` | integer | Later timestamp |
| `t1` | integer | Earlier timestamp |
Returns `t2 - t1` in seconds. Can be negative if `t1 > t2`.
## Platform Constant
Constant identifying the runtime:
```lua
os.platform -- "wippy"
```
## Navigation
Previous: Metrics (lua/system/metrics)
Next: TTY (lua/system/tty)