Linux Shell Script 取得日期並轉換為民國

 


在Linux系統中,Shell Script 是自動化任務的有力工具之一。

本文將介紹如何編寫一個簡單的Shell Script,以取得目前的日期並將其轉換為民國。

在Shell腳本中,要獲取目前的西元日期,我們可以使用date命令。
這個命令能夠提供系統的日期和時間信息,並且可以進行格式化以適應我們的需求。

我們還可以指定日期的格式來格式化輸出,以便它符合我們的需求。
首先要先了解每個參數與執行結果。

# %Y:獲取年份(四位數)
year=$(date +"%Y")
echo "當前年份:$year"

# %m:獲取月份(01-12)。
month=$(date +"%m")
echo "當前月份:$month"

# %d:獲取日期(01-31)。
day=$(date +"%d")
echo "今天是本月的第$day天"

# %e:獲取日期(1-31,不帶前置零)。
day_without_zero=$(date +"%e")
echo "今天是本月的第 $day_without_zero 天"

# %H:獲取小時(00-23)。
hour=$(date +"%H")
echo "當前小時:$hour"

# %M:獲取分鐘(00-59)。
minute=$(date +"%M")
echo "當前分鐘:$minute"

# %S:獲取秒鐘(00-59)。
second=$(date +"%S")
echo "當前秒鐘:$second"

# %A:獲取星期幾的完整名稱。
day_of_week=$(date +"%A")
echo "今天是星期$day_of_week"

# %a:獲取星期幾的縮寫名稱。
day_of_week_abbr=$(date +"%a")
echo "今天是星期$day_of_week_abbr"

# %B:獲取月份的完整名稱。
month_full=$(date +"%B")
echo "當前月份:$month_full"

# %b:獲取月份的縮寫名稱。
month_abbr=$(date +"%b")
echo "當前月份:$month_abbr"

# %c:獲取本地日期和時間的格式化字符串。
local_datetime=$(date +"%c")
echo "本地日期和時間:$local_datetime"

# %Z:獲取時區的縮寫。
timezone=$(date +"%Z")
echo "當前時區:$timezone"

# %j:獲取年份中的第幾天(001-366)。
day_of_year=$(date +"%j")
echo "今天是一年中的第$day_of_year天"

# %U:獲取一年中的第幾周(00-53),以星期日作為一周的第一天。
week_number=$(date +"%U")
echo "今年是第$week_number周"

# %W:獲取一年中的第幾周(00-53),以星期一作為一周的第一天。
week_number_monday=$(date +"%W")
echo "今年是第$week_number_monday周(以星期一為一周的第一天)"

# %x:獲取本地日期的格式化字符串。
local_date=$(date +"%x")
echo "本地日期:$local_date"

# %X:獲取本地時間的格式化字符串。
local_time=$(date +"%X")
echo "本地時間:$local_time"

# %p:獲取當前時間的上午或下午表示(AM或PM)。
ampm=$(date +"%p")
echo "當前時間是:$ampm"

# %I:獲取小時(01-12,12小時制)。
hour_12hr=$(date +"%I")
echo "當時小時(12小時制):$hour_12hr"

# %r:獲取本地時間的12小時制格式(hh:mm:ss AM/PM)。
local_time_12hr=$(date +"%r")
echo "本地時間(12小時制):$local_time_12hr"

# %D:獲取日期的簡化格式(月/日/年)。
date_short=$(date +"%D")
echo "日期(簡化格式):$date_short"

# %T:獲取時間的24小時制格式(hh:mm:ss)。
time_24hr=$(date +"%T")
echo "時間(24小時制):$time_24hr"

# %z:獲取時區偏移。
timezone_offset=$(date +"%z")
echo "時區偏移:$timezone_offset"

# %Z:獲取時區的名稱。
timezone_name=$(date +"%Z")
echo "時區名稱:$timezone_name"

==============================================

以下是詳細的說明如何在Shell腳本中獲取當前的日期:

# 今天的日期
today=$(date +"%Y-%m-%d")
echo "今天的日期:$today"

# 解釋:
# date命令用於獲取日期和時間信息。
# +"%Y-%m-%d"是一個格式化字串,指定了日期的輸出格式。
# %Y 表示四位數的年份(例如:2023)。
# %m 表示兩位數的月份(例如:01 表示一月)。
# %d 表示兩位數的日期(例如:04 表示第四天)。
# 結果將存儲在today變數中,以供以後使用。
# 輸出當前的西元日期

# 明天的日期
tomorrow=$(date -d "tomorrow" +"%Y-%m-%d")
echo "明天的日期:$tomorrow"

# 後天的日期
two_days_later=$(date -d "+2 days" +"%Y-%m-%d")
echo "後天的日期:$two_days_later"

# 昨天的日期
yesterday=$(date -d "yesterday" +"%Y-%m-%d")
echo "昨天的日期:$yesterday"

# 兩天前的日期
two_days_ago=$(date -d "2 days ago" +"%Y-%m-%d")
echo "兩天前的日期:$two_days_ago"

# 三天前的日期
three_days_ago=$(date -d "3 days ago" +"%Y-%m-%d")
echo "三天前的日期:$three_days_ago"

# 上星期的日期
last_week_date=$(date -d "last week" +"%Y-%m-%d")
echo "上星期的日期:$last_week_date"

# 下星期的日期
next_week_date=$(date -d "next week" +"%Y-%m-%d")
echo "下星期的日期:$next_week_date"

# 上個月的日期
last_month_date=$(date -d "last month" +"%Y-%m-%d")
echo "上個月的日期:$last_month_date"

# 下個月的日期
next_month_date=$(date -d "next month" +"%Y-%m-%d")
echo "下個月的日期:$next_month_date"




==============================================

了解如何取得日期,接下來我們使用date命令和awk命令
來獲取並轉換當前的西元日期為民國日期,實現日期轉民國。

# 西元轉民國
roc_date=$(date "+%Y%m%d" | awk '{printf("%d%s%s", $1-1911, $2, $3)}') echo "今天是民國:$roc_date"

date "+%Y%m%d"獲取西元日期,例如"20231004"。

接著,使用awk命令,您可以對這個日期進行處理。
awk '{printf("%d%s%s", $1-1911, $2, $3)}'的部分執行了以下操作:

$1-1911:減去1911,將西元年轉換為民國年。
$2:保留原始的月份部分。
$3:保留原始的日份部分。
最終,會輸出類似"今天是民國:1121004"的結果,
顯示了目前的民國日期。

==============================================
# 今天的日期
today_date=$(date +"%Y-%m-%d")
roc_today=$(date -d "$today_date" +"%Y-%m-%d" | awk -F'-' '{printf("%d 年 %s 月 %s 日", ($1 - 1911), $2, $3)}')
echo "今天的民國日期:$roc_today"

# 明天的日期
tomorrow_date=$(date -d "tomorrow" +"%Y-%m-%d")
roc_tomorrow=$(date -d "$tomorrow_date" +"%Y-%m-%d" | awk -F'-' '{printf("%d 年 %s 月 %s 日", ($1 - 1911), $2, $3)}')
echo "明天的民國日期:$roc_tomorrow"

# 後天的日期
two_days_later_date=$(date -d "+2 days" +"%Y-%m-%d")
roc_two_days_later=$(date -d "$two_days_later_date" +"%Y-%m-%d" | awk -F'-' '{printf("%d 年 %s 月 %s 日", ($1 - 1911), $2, $3)}')
echo "後天的民國日期:$roc_two_days_later"

# 昨天的日期
yesterday_date=$(date -d "yesterday" +"%Y-%m-%d")
roc_yesterday=$(date -d "$yesterday_date" +"%Y-%m-%d" | awk -F'-' '{printf("%d 年 %s 月 %s 日", ($1 - 1911), $2, $3)}')
echo "昨天的民國日期:$roc_yesterday"

# 兩天前的日期
two_days_ago_date=$(date -d "2 days ago" +"%Y-%m-%d")
roc_two_days_ago=$(date -d "$two_days_ago_date" +"%Y-%m-%d" | awk -F'-' '{printf("%d 年 %s 月 %s 日", ($1 - 1911), $2, $3)}')
echo "兩天前的民國日期:$roc_two_days_ago"

# 三天前的日期
three_days_ago_date=$(date -d "3 days ago" +"%Y-%m-%d")
roc_three_days_ago=$(date -d "$three_days_ago_date" +"%Y-%m-%d" | awk -F'-' '{printf("%d 年 %s 月 %s 日", ($1 - 1911), $2, $3)}')
echo "三天前的民國日期:$roc_three_days_ago"

# 上星期的日期
last_week_date=$(date -d "last week" +"%Y-%m-%d")
roc_last_week=$(date -d "$last_week_date" +"%Y-%m-%d" | awk -F'-' '{printf("%d 年 %s 月 %s 日", ($1 - 1911), $2, $3)}')
echo "上星期的民國日期:$roc_last_week"

# 下星期的日期
next_week_date=$(date -d "next week" +"%Y-%m-%d")
roc_next_week=$(date -d "$next_week_date" +"%Y-%m-%d" | awk -F'-' '{printf("%d 年 %s 月 %s 日", ($1 - 1911), $2, $3)}')
echo "下星期的民國日期:$roc_next_week"

# 上個月的日期
last_month_date=$(date -d "last month" +"%Y-%m-%d")
roc_last_month=$(date -d "$last_month_date" +"%Y-%m-%d" | awk -F'-' '{printf("%d 年 %s 月 %s 日", ($1 - 1911), $2, $3)}')
echo "上個月的民國日期:$roc_last_month"

# 下個月的日期
next_month_date=$(date -d "next month" +"%Y-%m-%d")
roc_next_month=$(date -d "$next_month_date" +"%Y-%m-%d" | awk -F'-' '{printf("%d 年 %s 月 %s 日", ($1 - 1911), $2, $3)}')
echo "下個月的民國日期:$roc_next_month"




==============================================

        西元轉換民國   -  1911    Function

==============================================
# 轉換西元年為民國年的函數
convert_to_roc_year() {
    local year="$1"
    local roc_year=$((year - 1911))
    echo "$roc_year"
}

# 今天的日期
today_date=$(date +"%Y-%m-%d")
roc_today=$(date -d "$today_date" +"%Y-%m-%d" | awk -F'-' '{printf("%d 年 %s 月 %s 日", convert_to_roc_year($1), $2, $3)}')
echo "今天的民國日期:$roc_today"

# 明天的日期
tomorrow_date=$(date -d "tomorrow" +"%Y-%m-%d")
roc_tomorrow=$(date -d "$tomorrow_date" +"%Y-%m-%d" | awk -F'-' '{printf("%d 年 %s 月 %s 日", convert_to_roc_year($1), $2, $3)}')
echo "明天的民國日期:$roc_tomorrow"

# 後天的日期
two_days_later_date=$(date -d "+2 days" +"%Y-%m-%d")
roc_two_days_later=$(date -d "$two_days_later_date" +"%Y-%m-%d" | awk -F'-' '{printf("%d 年 %s 月 %s 日", convert_to_roc_year($1), $2, $3)}')
echo "後天的民國日期:$roc_two_days_later"

# 昨天的日期
yesterday_date=$(date -d "yesterday" +"%Y-%m-%d")
roc_yesterday=$(date -d "$yesterday_date" +"%Y-%m-%d" | awk -F'-' '{printf("%d 年 %s 月 %s 日", convert_to_roc_year($1), $2, $3)}')
echo "昨天的民國日期:$roc_yesterday"

# 兩天前的日期
two_days_ago_date=$(date -d "2 days ago" +"%Y-%m-%d")
roc_two_days_ago=$(date -d "$two_days_ago_date" +"%Y-%m-%d" | awk -F'-' '{printf("%d 年 %s 月 %s 日", convert_to_roc_year($1), $2, $3)}')
echo "兩天前的民國日期:$roc_two_days_ago"

# 三天前的日期
three_days_ago_date=$(date -d "3 days ago" +"%Y-%m-%d")
roc_three_days_ago=$(date -d "$three_days_ago_date" +"%Y-%m-%d" | awk -F'-' '{printf("%d 年 %s 月 %s 日", convert_to_roc_year($1), $2, $3)}')
echo "三天前的民國日期:$roc_three_days_ago"

# 上星期的日期
last_week_date=$(date -d "last week" +"%Y-%m-%d")
roc_last_week=$(date -d "$last_week_date" +"%Y-%m-%d" | awk -F'-' '{printf("%d 年 %s 月 %s 日", convert_to_roc_year($1), $2, $3)}')
echo "上星期的民國日期:$roc_last_week"

# 下星期的日期
next_week_date=$(date -d "next week" +"%Y-%m-%d")
roc_next_week=$(date -d "$next_week_date" +"%Y-%m-%d" | awk -F'-' '{printf("%d 年 %s 月 %s 日", convert_to_roc_year($1), $2, $3)}')
echo "下星期的民國日期:$roc_next_week"

# 上個月的日期
last_month_date=$(date -d "last month" +"%Y-%m-%d")
roc_last_month=$(date -d "$last_month_date" +"%Y-%m-%d" | awk -F'-' '{printf("%d 年 %s 月 %s 日", convert_to_roc_year($1), $2, $3)}')
echo "上個月的民國日期:$roc_last_month"

# 下個月的日期
next_month_date=$(date -d "next month" +"%Y-%m-%d")
roc_next_month=$(date -d "$next_month_date" +"%Y-%m-%d" | awk -F'-' '{printf("%d 年 %s 月 %s 日", convert_to_roc_year($1), $2, $3)}')
echo "下個月的民國日期:$roc_next_month"




留言

這個網誌中的熱門文章

Routeros中TX與RX的定義

RouterOS 啟用 (NAT)IP地址轉換

Windows 7 輸入法不見