2010-03-22 45 views
5

Làm cách nào để thêm hậu tố vào số ngày ngày của một ngày không hợp lệ?Định dạng ngày trong unix để bao gồm hậu tố vào ngày (st, nd, rd và th)

Tôi sẽ giải thích. Tôi có một đoạn mã TextMate viết ra ngày hôm nay. Nó sử dụng ngày và định dạng unix. Đây là mã:

`date +%A` `date +%d` `date +%B` `date +%Y` 

Nó ra:

thứ hai ngày 22 tháng 3 năm 2010

Tôi muốn thêm hậu tố vào ngày (st, nd, rdth) như sau:

.210

thứ Hai 22 tháng ba năm 2010

Theo như tôi có thể nhìn thấy, không có chức năng có nguồn gốc ở định dạng ngày tháng unix, giống như có trong PHP (j). Làm thế nào tôi sẽ đạt được điều này trong unix? Một regex phức tạp về số ngày?

+0

Không thực sự trả lời câu hỏi của bạn, nhưng tôi muốn củng cố các lệnh date: ngày "+% A% d% B% Y" -> Thứ Hai 22 Tháng Ba 2010 – zigdon

+0

Nếu tôi là bạn, tôi muốn viết một kịch bản PHP nhỏ (vì bạn đã biết cách thực hiện nó ở đó) và thực thi nó. Tôi không biết, nếu nó có thể cài đặt PHP trên hệ thống đích mặc dù. –

Trả lời

3

Tôi có thứ tương tự hoạt động trên máy Linux (Ubuntu 8.10). Tôi không nghĩ rằng nó sẽ làm việc với Solaris, một máy tôi đã thử nghiệm không cho phép sử dụng một ký tự _ theo% để tránh đệm lĩnh vực với 0. Không đệm cho phép ngày trở về 1 thay vì 01 (01st doesn 't nhìn bên phải so với 1st).

Tôi sử dụng chức năng vỏ (một lần nữa, hệ điều hành hoặc phiên bản trình bao có thể không giống như cách tôi định nghĩa hàm) có tên DaySuffix, sau đó gọi func đó là một phần của cuộc gọi ngày. Các func chính nó là khá hacky, tôi chắc chắn có một cách tốt hơn để làm điều này nhưng nó làm việc cho tôi. Lưu ý các trường hợp đặc biệt cho 11, 12, & 13 - bạn phải yêu thích ngôn ngữ tiếng Anh!

#!/bin/sh 

DaySuffix() { 
    if [ "x`date +%-d | cut -c2`x" = "xx" ] 
    then 
     DayNum=`date +%-d` 
    else 
     DayNum=`date +%-d | cut -c2` 
    fi 

    CheckSpecialCase=`date +%-d` 
    case $DayNum in 
    0) 
     echo "th" ;; 
    1) 
     if [ "$CheckSpecialCase" = "11" ] 
     then 
     echo "th" 
     else 
     echo "st" 
     fi ;; 
    2) 
     if [ "$CheckSpecialCase" = "12" ] 
     then 
     echo "th" 
     else 
     echo "nd" 
     fi ;; 
    3) 
     if [ "$CheckSpecialCase" = "13" ] 
     then 
     echo "th" 
     else 
     echo "rd" 
     fi ;; 
    [4-9]) 
     echo "th" ;; 
    *) 
     return 1 ;; 
    esac 
} 

# Using consolidated date command from chris_l 
# Also using %-d instead of %d so it doesn't pad with 0's 
date "+%A %-d`DaySuffix` %B %Y" 
+0

Tôi đã có thể sử dụng mã này để khắc phục sự cố của mình. Tuy nhiên, tôi không thể sử dụng +% - d vì dấu gạch ngang không được phép. Chỉ định dạng unix nghiêm ngặt. http://en.wikipedia.org/wiki/Date_(Unix). Tôi đã sử dụng +% e ở vị trí của nó và nó hoạt động tốt. Mặc dù tôi nghĩ rằng nó cho biết thêm một không gian thêm với các chữ số duy nhất (như 1-9). Tôi sẽ khắc phục vấn đề đó vào ngày 1 tháng Tư. Cảm ơn đã giúp đỡ. ;) – skymook

5

Thử.

#!/bin/sh 
DaySuffix() { 
    case `date +%d` in 
    1|21|31) echo "st";; 
    2|22) echo "nd";; 
    3|23) echo "rd";; 
    *)  echo "th";; 
    esac 
} 
date "+%A %d`DaySuffix` %B %Y" 
Các vấn đề liên quan