# Time::Str

Parse and format date/time strings in multiple standard formats.

```perl
use Time::Str qw(str2time str2date time2str);

# Parse to Unix timestamp
my $time = str2time('2024-12-24T15:30:45Z');
# 1735052445

my $time = str2time('Mon, 24 Dec 2012 15:30:45 +0100', format => 'RFC2822');

# Parse to components
my %date = str2date('2024-12-24T15:30:45.500+01:00');
# (year => 2024, month => 12, day => 24, hour => 15,
#  minute => 30, second => 45, nanosecond => 500000000,
#  tz_offset => 60)

# Format Unix timestamp
my $str = time2str(1735052445);
# '2024-12-24T15:30:45Z'

my $str = time2str(1735052445, format => 'RFC2822', offset => 60);
# 'Tue, 24 Dec 2024 16:30:45 +0100'
```

## Supported Formats

### Profiles of ISO 8601

| Format                                                          | Example                      |
|-----------------------------------------------------------------|------------------------------|
| [ISO8601](https://metacpan.org/pod/Time::Str#ISO8601)           | `20241224T153045.500+0100`   |
| [RFC4287](https://metacpan.org/pod/Time::Str#RFC4287)           | `2024-12-24T15:30:45Z`       |
| [W3CDTF](https://metacpan.org/pod/Time::Str#W3CDTF)             | `2024-12-24T15:30:45+01:00`  |
| [RFC5545](https://metacpan.org/pod/Time::Str#RFC5545)           | `20241224T153045Z`           |

### Based on ISO 8601

| Format                                                          | Example                                   |
|-----------------------------------------------------------------|-------------------------------------------|
| [RFC3339](https://metacpan.org/pod/Time::Str#RFC3339)           | `2024-12-24 15:30:45+01:00`               |
| [RFC9557](https://metacpan.org/pod/Time::Str#RFC9557)           | `2024-12-24 15:30:45+01:00[Europe/Paris]` |
| [ISO9075](https://metacpan.org/pod/Time::Str#ISO9075)           | `2024-12-24 15:30:45 +01:00`              |
| [ASN1GT](https://metacpan.org/pod/Time::Str#ASN1GT)             | `20241224153045Z`                         |
| [ASN1UT](https://metacpan.org/pod/Time::Str#ASN1UT)             | `241224153045Z`                           |
| [RFC5280](https://metacpan.org/pod/Time::Str#RFC5280)           | `241224153045Z`                           |

### RFC / IMF / HTTP / IMAP

| Format                                                          | Example                              |
|-----------------------------------------------------------------|--------------------------------------|
| [RFC2822](https://metacpan.org/pod/Time::Str#RFC2822)           | `Tue, 24 Dec 2024 15:30:45 +0100`    |
| [RFC2616](https://metacpan.org/pod/Time::Str#RFC2616)           | `Tue, 24 Dec 2024 15:30:45 GMT`      |
| [RFC3501](https://metacpan.org/pod/Time::Str#RFC3501)           | `24-Dec-2024 15:30:45 +0100`         |

### Unix / C Library

| Format                                                          | Example                              |
|-----------------------------------------------------------------|--------------------------------------|
| [ANSIC](https://metacpan.org/pod/Time::Str#ANSIC)               | `Tue Dec 24 15:30:45 2024`           |
| [UnixDate](https://metacpan.org/pod/Time::Str#UnixDate)         | `Tue Dec 24 15:30:45 UTC 2024`       |
| [UnixStamp](https://metacpan.org/pod/Time::Str#UnixStamp)       | `Tue Dec 24 15:30:45.500 2024 UTC`   |
| [GitDate](https://metacpan.org/pod/Time::Str#GitDate)           | `Tue Dec 24 15:30:45 2024 +0100`     |
| [RubyDate](https://metacpan.org/pod/Time::Str#RubyDate)         | `Tue Dec 24 15:30:45 +0100 2024`     |

`UnixStamp` is a superset of `ANSIC`, `GitDate`, `RubyDate`, and `UnixDate`.

### Other

| Format                                                           | Example                              |
|------------------------------------------------------------------|--------------------------------------|
| [ECMAScript](https://metacpan.org/pod/Time::Str#ECMAScript)      | `Tue Dec 24 2024 15:30:45 GMT+0100`  |
| [CLF](https://metacpan.org/pod/Time::Str#CLF)                    | `24/Dec/2024:15:30:45 +0100`         |
| [DateTime](https://metacpan.org/pod/Time::Str#DateTime)          | *(permissive, multi-format parser)*  |

`DateTime` can parse `ISO8601` (extended format), `RFC3339`, `RFC9557`,
`RFC4287`, `W3CDTF`, `ISO9075`, `RFC2822`, `RFC2616`, `RFC3501`, and
`ECMAScript` formats.

Each format is implemented according to its specification. Optional fields
are optional. Constrained fields are validated. Day names, when present,
are verified against the actual date.

## The `DateTime` Format

The `DateTime` format is a permissive parser for real-world dates that does
not use heuristics. If it cannot parse the input unambiguously, it croaks.

```perl
str2date('Monday, 24th December 2024 at 3:30 PM UTC+01:00',
         format => 'DateTime');

str2date('2024-12-24T15:30:45+01:00[Europe/Stockholm]',
         format => 'DateTime');

str2date('24.XII.2024', format => 'DateTime');
```

Numeric dates must be in year-month-day order. Ordinal suffixes must match
the day number. Four-digit years are required.

See [DATETIME FORMAT PARSING](https://metacpan.org/pod/Time::Str#DATETIME-FORMAT-PARSING) in the documentation.

## Installation

```
cpanm Time::Str
```

Requires Perl 5.10.1 or later. Runtime dependencies are `Carp` and
`Exporter`, both core modules.

## Optional C/XS

The XS backend (C99) is loaded when a compiler is available; otherwise it
falls back to Pure Perl. The `TIME_STR_PP` environment variable forces the
Pure Perl path.

```perl
say Time::Str::IMPLEMENTATION;  # "XS" or "PP"
```

The XS backend includes native C parsers (generated by Ragel) for RFC 3339,
RFC 2822, and ECMAScript formats. When available, these are tried
first; otherwise parsing falls back to the precompiled regexps from
`Time::Str::Regexp`. Both paths produce identical results.

## Related Modules

- [Time::Str::Regexp](https://metacpan.org/pod/Time::Str::Regexp) - Precompiled regexps with named captures for all formats
- [Time::Str::Token](https://metacpan.org/pod/Time::Str::Token) - Token parsers (month names, day names, timezone offsets)
- [Time::Str::Calendar](https://metacpan.org/pod/Time::Str::Calendar) - Gregorian calendar utilities (leap year, day-of-week, RDN conversion)

## Documentation

Full documentation is available on [MetaCPAN](https://metacpan.org/pod/Time::Str) or via `perldoc Time::Str` after installation.

## Standards

- [ISO 8601:2019](https://www.iso.org/obp/ui/#iso:std:iso:8601)
- [RFC 3339](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6)
- [RFC 2822](https://datatracker.ietf.org/doc/html/rfc2822#section-3.3) / [RFC 5322](https://datatracker.ietf.org/doc/html/rfc5322#section-3.3)
- [RFC 2616](https://datatracker.ietf.org/doc/html/rfc2616#section-3.3) / [RFC 7231](https://datatracker.ietf.org/doc/html/rfc7231#section-7.1.1.1)
- [RFC 3501](https://datatracker.ietf.org/doc/html/rfc3501#section-2.3.3) / [RFC 9051](https://datatracker.ietf.org/doc/html/rfc9051#section-2.3.3)
- [RFC 4287](https://datatracker.ietf.org/doc/html/rfc4287#section-3.3)
- [RFC 5280](https://datatracker.ietf.org/doc/html/rfc5280#section-4.1.2.5)
- [RFC 5545](https://datatracker.ietf.org/doc/html/rfc5545#section-3.3.4)
- [RFC 9557](https://datatracker.ietf.org/doc/html/rfc9557)
- [ISO 9075](https://www.iso.org/standard/76583.html)
- [ITU-T X.680 / ISO/IEC 8824-1](https://www.itu.int/rec/T-REC-X.680-202102-I) (ASN.1)
- [W3C Date and Time Formats](https://www.w3.org/TR/NOTE-datetime)
- [ECMAScript Date.prototype.toString](https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-date.prototype.tostring)

## Author

Christian Hansen

## License

This library is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.
