# NAME

POSIX::strftime::Compiler - Compile strftime to perl. for logger and servers

# SYNOPSIS

    use POSIX::strftime::Compiler;

    my $psc = POSIX::strftime::Compiler->new('%a, %d %b %Y %T %z');
    say $psc->to_string(localtime):

# DESCRIPTION

POSIX::strftime::Compiler compiles strftime's format to perl. And generates formatted string.
Because this module compiles strftime to perl code, it has good performance.

POSIX::strftime::Compiler has compatibility with GNU's strftime, but only supports "C" locale.
It's useful for loggers and servers. 

# METHDO

- new($fmt:String)

    create instance of POSIX::strftime::Compiler.

- to\_string(@time)

    generate formatted string.

        my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime();
        $psc->to_string($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst):

# SUPPORTED FORMAT

- `%a`

    The abbreviated weekday name according to the current locale.

- `%A`

    The full weekday name according to the current locale.

- `%b`

    The abbreviated month name according to the current locale.

- `%B`

    The full month name according to the current locale.

- `%c`

    The preferred date and time representation for the current locale.

- `%C`

    The century number (year/100) as a 2-digit integer. (SU)

- `%d`

    The day of the month as a decimal number (range 01 to 31).

- `%D`

    Equivalent to `%m/%d/%y`. (for Americans only: Americans should note that in
    other countries `%d/%m/%y` is rather common. This means that in international
    context this format is ambiguous and should not be used.) (SU)

- `%e`

    Like `%d`, the day of the month as a decimal number, but a leading zero is
    replaced by a space. (SU)

- `%E`

    Modifier: use alternative format, see below. (SU)

- `%F`

    Equivalent to `%Y-%m-%d` (the ISO 8601 date format). (C99)

- `%G`

    The ISO 8601 week-based year with century as a decimal number. The
    4-digit year corresponding to the ISO week number (see `%V`). This has the
    same format and value as %Y, except that if the ISO week number belongs to the
    previous or next year, that year is used instead. (TZ)

- `%g`

    Like `%G`, but without century, that is, with a 2-digit year (00-99). (TZ)

- `%h`

    Equivalent to `%b`. (SU)

- `%H`

    The hour as a decimal number using a 24-hour clock (range 00 to 23).

- `%I`

    The hour as a decimal number using a 12-hour clock (range 01 to 12).

- `%j`

    The day of the year as a decimal number (range 001 to 366).

- `%k`

    The hour (24-hour clock) as a decimal number (range 0 to 23); single digits
    are preceded by a blank. (See also `%H`.) (TZ)

- `%l`

    The hour (12-hour clock) as a decimal number (range 1 to 12); single digits
    are preceded by a blank. (See also `%I`.) (TZ)

- `%m`

    The month as a decimal number (range 01 to 12).

- `%M`

    The minute as a decimal number (range 00 to 59).

- `%n`

    A newline character. (SU)

- `%N`

    Nanoseconds (range 000000000 to 999999999). It is a non-POSIX extension and
    outputs a nanoseconds if there is floating seconds argument.

- `%O`

    Modifier: use alternative format, see below. (SU)

- `%p`

    Either "AM" or "PM" according to the given time value, or the corresponding
    strings for the current locale. Noon is treated as "PM" and midnight as "AM".

- `%P`

    Like `%p` but in lowercase: "am" or "pm" or a corresponding string for the
    current locale. (GNU)

- `%r`

    The time in a.m. or p.m. notation. In the POSIX locale this is equivalent to
    `%I:%M:%S %p`. (SU)

- `%R`

    The time in 24-hour notation (%H:%M). (SU) For a version including the
    seconds, see `%T` below.

- `%s`

    The number of seconds since the Epoch, 1970-01-01 00:00:00 +0000 (UTC). (TZ)

- `%S`

    The second as a decimal number (range 00 to 60). (The range is up to 60 to
    allow for occasional leap seconds.)

- `%t`

    A tab character. (SU)

- `%T`

    The time in 24-hour notation (`%H:%M:%S`). (SU)

- `%u`

    The day of the week as a decimal, range 1 to 7, Monday being 1. See also
    `%w`. (SU)

- `%U`

    The week number of the current year as a decimal number, range 00 to 53,
    starting with the first Sunday as the first day of week 01. See also `%V` and
    `%W`.

- `%V`

    The ISO 8601 week number of the current year as a decimal number,
    range 01 to 53, where week 1 is the first week that has at least 4 days in the
    new year. See also `%U` and `%W`. (SU)

- `%w`

    The day of the week as a decimal, range 0 to 6, Sunday being 0. See also
    `%u`.

- `%W`

    The week number of the current year as a decimal number, range 00 to 53,
    starting with the first Monday as the first day of week 01.

- `%x`

    The preferred date representation for the current locale without the time.

- `%X`

    The preferred time representation for the current locale without the date.

- `%y`

    The year as a decimal number without a century (range 00 to 99).

- `%Y`

    The year as a decimal number including the century.

- `%z`

    The `+hhmm` or `-hhmm` numeric timezone (that is, the hour and minute offset
    from UTC). (SU)

- `%Z`

    The timezone or name or abbreviation.

- `%%`

    A literal `%` character.

`%E[cCxXyY]` and `%O[deHImMSuUVwWy]` are not supported, just remove E and O prefix.

# SEE ALSO

- [POSIX::strftime::GNU](http://search.cpan.org/perldoc?POSIX::strftime::GNU)

    POSIX::strftime::Compiler is built on POSIX::strftime::GNU::PP code

- [POSIX](http://search.cpan.org/perldoc?POSIX)
- [Apache::LogFormat::Compiler](http://search.cpan.org/perldoc?Apache::LogFormat::Compiler)

# LICENSE

Copyright (C) Masahiro Nagano.

Format specification is based on strftime(3) manual page which is a part of the Linux man-pages project.

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

# AUTHOR

Masahiro Nagano <kazeburo@gmail.com>