Ruby strftime: Miesiąc bez wiodącego zera?

89

Czy Ruby strftimema format miesiąca bez początkowego zera?

Znalazłem %edzień bez wiodącego zera, ale nie miałem szczęścia z miesiącem.

Ostatecznie chcę mieć datę w formacie: 9/1/2010

Shpigford
źródło
2
Czy to 9 stycznia czy 1 października?
telent
@telent to jednak klient interpretuje to :)
Factor Mystic
11
Jestem prawie pewien, że to nie 1 października .....
brad

Odpowiedzi:

138

Niektóre wersje strftimezezwalają na prefiksowanie minusem w celu formatowania wiodących zer, na przykład:

strftime "%-d/%-m/%y"

Jednak będzie to zależeć strftimeod twojego systemu. Więc dla spójności zrobiłbym coś takiego:

dt = Time.local(2010, 'Sep', 1)
printf "%d/%d/%d", dt.day, dt.month, dt.year
draegtun
źródło
Wygląda na to, że minus działa dobrze z Ruby 1.8.7, dzięki!
Rob
2
@Rob: Tak, będzie działać tak długo, jak długo strftimeobsługuje go twój system (np. Nie działa tutaj na 1.8.7 działającym na Mac OSX Snow Leopard).
draegtun
Ach tak, powinienem był wyjaśnić, że na Ubuntu Linux było to 1.8.7
Rob
Pracował dla mnie. 1.9.2p180 na Ubuntu.
B Seven
Działa dla mnie z 1.9.3 na FreeBSD 9
user569825
39

Oto lista formatowania, z której wychodzę. To pochodzi z dokumentacji 2.1.3. Zgodnie z tym chciałbyś %-m:

Date (Year, Month, Day):
  %Y - Year with century (can be negative, 4 digits at least)
          -0001, 0000, 1995, 2009, 14292, etc.
  %C - year / 100 (rounded down such as 20 in 2009)
  %y - year % 100 (00..99)

  %m - Month of the year, zero-padded (01..12)
          %_m  blank-padded ( 1..12)
          %-m  no-padded (1..12)
  %B - The full month name (``January'')
          %^B  uppercased (``JANUARY'')
  %b - The abbreviated month name (``Jan'')
          %^b  uppercased (``JAN'')
  %h - Equivalent to %b

  %d - Day of the month, zero-padded (01..31)
          %-d  no-padded (1..31)
  %e - Day of the month, blank-padded ( 1..31)

  %j - Day of the year (001..366)

Time (Hour, Minute, Second, Subsecond):
  %H - Hour of the day, 24-hour clock, zero-padded (00..23)
  %k - Hour of the day, 24-hour clock, blank-padded ( 0..23)
  %I - Hour of the day, 12-hour clock, zero-padded (01..12)
  %l - Hour of the day, 12-hour clock, blank-padded ( 1..12)
  %P - Meridian indicator, lowercase (``am'' or ``pm'')
  %p - Meridian indicator, uppercase (``AM'' or ``PM'')

  %M - Minute of the hour (00..59)

  %S - Second of the minute (00..60)

  %L - Millisecond of the second (000..999)
       The digits under millisecond are truncated to not produce 1000.
  %N - Fractional seconds digits, default is 9 digits (nanosecond)
          %3N  millisecond (3 digits)
          %6N  microsecond (6 digits)
          %9N  nanosecond (9 digits)
          %12N picosecond (12 digits)
          %15N femtosecond (15 digits)
          %18N attosecond (18 digits)
          %21N zeptosecond (21 digits)
          %24N yoctosecond (24 digits)
       The digits under the specified length are truncated to avoid
       carry up.

Time zone:
  %z - Time zone as hour and minute offset from UTC (e.g. +0900)
          %:z - hour and minute offset from UTC with a colon (e.g. +09:00)
          %::z - hour, minute and second offset from UTC (e.g. +09:00:00)
  %Z - Abbreviated time zone name or similar information.

Weekday:
  %A - The full weekday name (``Sunday'')
          %^A  uppercased (``SUNDAY'')
  %a - The abbreviated name (``Sun'')
          %^a  uppercased (``SUN'')
  %u - Day of the week (Monday is 1, 1..7)
  %w - Day of the week (Sunday is 0, 0..6)

ISO 8601 week-based year and week number:
The first week of YYYY starts with a Monday and includes YYYY-01-04.
The days in the year before the first week are in the last week of
the previous year.
  %G - The week-based year
  %g - The last 2 digits of the week-based year (00..99)
  %V - Week number of the week-based year (01..53)

Week number:
The first week of YYYY that starts with a Sunday or Monday (according to %U
or %W). The days in the year before the first week are in week 0.
  %U - Week number of the year. The week starts with Sunday. (00..53)
  %W - Week number of the year. The week starts with Monday. (00..53)

Seconds since the Epoch:
  %s - Number of seconds since 1970-01-01 00:00:00 UTC.

Literal string:
  %n - Newline character (\n)
  %t - Tab character (\t)
  %% - Literal ``%'' character

Combination:
  %c - date and time (%a %b %e %T %Y)
  %D - Date (%m/%d/%y)
  %F - The ISO 8601 date format (%Y-%m-%d)
  %v - VMS date (%e-%^b-%4Y)
  %x - Same as %D
  %X - Same as %T
  %r - 12-hour time (%I:%M:%S %p)
  %R - 24-hour time (%H:%M)
  %T - 24-hour time (%H:%M:%S)

Zaktualizowano do najnowszych dokumentów 2.1.3 w dniu 24.10.14

Rob Cameron
źródło
7
Szukam miesiąca bez wiodącego zera ... nie dnia.
Shpigford
2
Dlaczego wszyscy głosują na ten post W DÓŁ? Pomyślałbym, że ta lista pomocników strftime byłaby przydatna!
Rob Cameron
4
Wyobrażam sobie, że ludzie głosują w dół, ponieważ nie odpowiada to na pytanie. Sama lista jest całkiem przydatna, ale żadna z tych opcji nie zapobiega wiodącemu „0” w miesiącu, zgodnie z żądaniem PO.
Benry
1
+1 Pomimo tego, że to pytanie nie odpowiada na pierwotne pytanie, jest przydatne dla innych osób, które szukają w Google czegoś podobnego, ale nie do końca OP.
David Oneill,
1
% e zapewnia wiodącą pozycję (np. „1/01/2012”), która może być niepożądana i niekoniecznie jest tym, czego chciał PO.
brad
8

Dokumenty pokazują wiele różnych opcji konfigurowania formatu liczb. Dodając do formatu% -d, możesz także użyć tych flag zamiast „-”:

Flags:
  -  don't pad a numerical output.
  _  use spaces for padding.
  0  use zeros for padding.
  ^  upcase the result string.
  #  change case.
  :  use colons for %z.
typoneerror
źródło
7

Miałem podobny problem i naprawiłem go, zamieniając strftime("%m")na liczbę całkowitą.

Na przykład:

strftime("%m")+0 give the current month as integer 'without leading zero'

Proste, ale nie eleganckie.

cyberw0rm
źródło