Ruby strftime: Mês sem zero à esquerda?


88

Ruby strftimetem um formato para o mês sem um zero à esquerda?

Achei %epor conseguir o dia sem o zero à esquerda, mas não tive sorte com o mês.

No final das contas, você quer uma data formatada como: 9/1/2010


2
Isso é 9 de janeiro ou 1 de outubro?
Telent

@telent é, no entanto, o cliente interpreta :)
Factor Mystic

11
Tenho certeza que não é 1º de outubro ...
brad

Respostas:


135

Algumas versões strftimedo permitem prefixar com menos para formatar zeros à esquerda, por exemplo:

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

No entanto, isso dependerá strftimedo seu sistema. Então, para consistência, eu faria algo assim:

dt = Time.local(2010, 'Sep', 1)
printf "%d/%d/%d", dt.day, dt.month, dt.year

Parece que o sinal de menos funciona bem com Ruby 1.8.7, obrigado!
Rob

2
@Rob: Sim, funcionará desde que o seu sistema o strftimesuporte (por exemplo, não funciona aqui no 1.8.7 rodando em cima do Mac OSX Snow Leopard).
draegtun

Sim, eu deveria ter esclarecido que era 1.8.7 no ubuntu linux
Rob

Funcionou para mim. 1.9.2p180 no Ubuntu.
B Sete

Funciona para mim com 1.9.3 no FreeBSD 9
user569825

39

Aqui está a lista de formatação da qual saio. Isso é da documentação de 2.1.3. De acordo com isso, você deseja %-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)

Atualizado para os documentos 2.1.3 mais recentes em 24/10/14


7
Estou procurando como obter o mês sem o zero à esquerda ... não o dia.
Shpigford

2
Por que todos estão votando nesta postagem PARA BAIXO? Eu teria pensado que ter esta lista de ajudantes strftime seria útil!
Rob Cameron

4
Eu imagino que as pessoas estão votando contra porque não responde à pergunta. Por si só, a lista é bastante útil, mas nenhuma dessas opções evita o "0" inicial para o mês, conforme solicitado pelo OP.
Benry

1
1 Apesar de esta pergunta não responder à pergunta original, é útil para outras pessoas que procuram algo semelhante no Google, mas não exatamente o OP.
David Oneill

1
% e fornece um espaço inicial (ou seja, "01/01/2012") que pode ser indesejável e não é necessariamente o que o OP queria.
brad

8

O Documentos mostra várias opções diferentes para configurar o formato dos números. Adicionando ao formato% -d, você também pode usar esses sinalizadores no lugar de "-":

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.

7

Tive um problema semelhante e resolvi-o convertendo strftime("%m")para um número inteiro.

Por exemplo:

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

Simples, embora não seja elegante.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.