Back to Mruby

mruby-strftime

mrbgems/mruby-strftime/README.md

4.0.03.4 KB
Original Source

mruby-strftime

Time#strftime implementation for mruby.

Overview

This gem provides the strftime method for Time objects in mruby, enabling formatted time string output using standard format directives.

Usage

ruby
require 'mruby-strftime'

t = Time.new(2023, 12, 25, 10, 30, 45)

t.strftime("%Y-%m-%d")           #=> "2023-12-25"
t.strftime("%H:%M:%S")           #=> "10:30:45"
t.strftime("%Y-%m-%d %H:%M:%S")  #=> "2023-12-25 10:30:45"
t.strftime("%A, %B %d, %Y")      #=> "Monday, December 25, 2023"

Format Specifiers

The strftime method supports standard format directives. The exact set of available directives depends on your system's strftime(3) implementation. Common directives include:

Date Components

  • %Y - Year with century (e.g., 2023)
  • %y - Year without century (00-99)
  • %m - Month of the year (01-12)
  • %B - Full month name (e.g., "December")
  • %b - Abbreviated month name (e.g., "Dec")
  • %d - Day of the month (01-31)
  • %j - Day of the year (001-366)

Time Components

  • %H - Hour of the day, 24-hour clock (00-23)
  • %I - Hour of the day, 12-hour clock (01-12)
  • %M - Minute of the hour (00-59)
  • %S - Second of the minute (00-60)
  • %p - AM/PM indicator
  • %Z - Timezone name or abbreviation

Weekday

  • %A - Full weekday name (e.g., "Monday")
  • %a - Abbreviated weekday name (e.g., "Mon")
  • %w - Day of the week (0-6, Sunday is 0)
  • %u - Day of the week (1-7, Monday is 1)

Combined Formats

  • %c - Preferred date and time representation
  • %x - Preferred date representation
  • %X - Preferred time representation
  • %F - ISO 8601 date format (equivalent to %Y-%m-%d)
  • %T - ISO 8601 time format (equivalent to %H:%M:%S)

Special Characters

  • %% - Literal % character
  • %n - Newline character
  • %t - Tab character

Features

Timezone Support

The method respects the timezone of the Time object:

ruby
t_utc = Time.utc(2023, 12, 25, 12, 0, 0)
t_local = Time.local(2023, 12, 25, 12, 0, 0)

t_utc.strftime("%Y-%m-%d %H:%M:%S %Z")
#=> "2023-12-25 12:00:00 UTC"

t_local.strftime("%Y-%m-%d %H:%M:%S %z")
#=> "2023-12-25 12:00:00 +0900" (example for JST)

NUL Byte Handling

Unlike some implementations, mruby-strftime correctly handles NUL bytes (\0) embedded in format strings, preserving them in the output:

ruby
t = Time.gm(2023, 12, 25)
result = t.strftime("year\0%Y")
result.length  #=> 9 (includes the NUL byte)

This behavior maintains Ruby's string semantics where strings are length-based rather than null-terminated.

Implementation Details

Buffer Management

The implementation uses dynamic buffer allocation:

  • Initial buffer size: 64 bytes
  • Maximum buffer size: 4096 bytes
  • Automatically grows when needed for longer formatted strings

Platform Compatibility

This gem uses the system's strftime(3) function for formatting. The exact behavior of format directives may vary slightly between platforms, particularly for:

  • Locale-dependent formats (day/month names, date/time preferences)
  • Timezone representations
  • Platform-specific extensions

Dependencies

  • mruby-time - Required for Time class support

Installation

Add to your build_config.rb:

ruby
conf.gem :core => 'mruby-strftime'

Or include via gembox:

ruby
conf.gembox 'stdlib-ext'  # Includes mruby-strftime

License

MIT License - See mruby's main license file for details.