Ruby strftime: Tháng không có số 0 ở đầu?


89

Ruby strftimecó định dạng cho tháng không có số 0 ở đầu không?

Tôi tìm thấy %engày không có số 0 ở đầu, nhưng không gặp may mắn với tháng.

Cuối cùng muốn một ngày được định dạng như sau: 9/1/2010


2
Đó là ngày 9 tháng Giêng hay ngày 1 tháng Mười?
telent

@telent nó tuy nhiên diễn giải client nó :)
Yếu tố Mystic

11
Tôi khá chắc rằng đó không phải là ngày 1 tháng 10 .....
brad

Câu trả lời:


138

Một số phiên bản của strftimedo cho phép thêm tiền tố bằng dấu trừ để định dạng các số 0 ở đầu, ví dụ:

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

Tuy nhiên điều này sẽ phụ thuộc vào strftimehệ thống của bạn. Vì vậy, để nhất quán, tôi sẽ làm một cái gì đó như sau:

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

Có vẻ như điểm trừ hoạt động tốt với Ruby 1.8.7, cảm ơn!
Rob

2
@Rob: Có, nó sẽ hoạt động miễn là hệ thống của bạn strftimehỗ trợ nó (ví dụ: nó không hoạt động ở đây trên 1.8.7 chạy trên Mac OSX Snow Leopard).
draegtun

À vâng, lẽ ra tôi phải làm rõ rằng đó là 1.8.7 trên Linux linux ubuntu
Rob

Đã làm cho tôi. 1.9.2p180 trên Ubuntu.
B Bảy

Công trình cho tôi với 1.9.3 trên FreeBSD 9
user569825

39

Đây là danh sách định dạng mà tôi bỏ qua. Đây là từ các tài liệu cho 2.1.3. Theo điều này, bạn sẽ muốn %-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)

Cập nhật lên tài liệu 2.1.3 mới nhất vào ngày 24/10/14


7
Tôi đang tìm cách lấy tháng không có số 0 ở đầu ... không phải ngày.
Shpigford

2
Tại sao mọi người bình chọn bài đăng này XUỐNG? Tôi đã nghĩ rằng có danh sách những người trợ giúp strftime này sẽ hữu ích!
Rob Cameron

4
Tôi tưởng tượng rằng mọi người đang bỏ phiếu vì nó không trả lời câu hỏi. Bản thân danh sách này khá hữu ích, nhưng không có tùy chọn nào trong số này ngăn cản "0" hàng đầu của tháng như OP yêu cầu.
Benry

1
+1 Mặc dù câu hỏi này không trả lời câu hỏi ban đầu, nó rất hữu ích cho những người khác, những người đã tìm kiếm thứ gì đó tương tự nhưng không chính xác là OP.
David Oneill

1
% e cung cấp một khoảng trống ở đầu (tức là "1/01/2012") có thể không mong muốn và không nhất thiết phải là những gì OP muốn.
brad

8

Tài liệu hiển thị một số tùy chọn khác nhau để định cấu hình định dạng số. Thêm vào định dạng% -d, bạn cũng có thể sử dụng các cờ này thay cho "-":

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

Tôi đã gặp sự cố tương tự và đã khắc phục nó bằng cách chuyển đổi strftime("%m")thành một số nguyên.

Ví dụ:

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

Đơn giản, mặc dù không thanh lịch.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.