ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 日期时间格式化

日期时间格式化

原创 Linux操作系统 作者:leon830216 时间:2014-03-01 19:16:43 0 删除 编辑
================================================================================
1. 打印
$ echo `date '+%Y-%m-%d %H:%M:%S'`
2012-03-21 21:49:47

2. 赋值给变量
VAR=`date '+%Y-%m-%d %H:%M:%S'`
================================================================================
X. 格式化参数
%H - hh24 (00..23)
%I - hh12 (01..12)
%k - h24 (0..23)
%l - h12 (1..12)
%M - mm   (00..59)
%p - AM (PM)
%r - hh12:mm:ss AM (PM)
%s - 从1970年1月1日00:00:00到目前经历的秒数
%S - ss (00..59)
%T - hh24:mm:ss
%X - 显示时间的格式 (%H时:%M分:%S秒)
%Z - 时区日期域
%a - 星期几简称 (Sun..Sat)
%A - 星期几全称 (Sunday..Saturday)
%b - 月简称 (Jan..Dec)
%B - 月全称 (January..December)
%c - 日期和时间 (2012年03月27日 09時53分42秒)
%d - 一个月的第几天 (01..31)
%D - 日期 (mm/dd/yy)
%h - 和 %b 选项相同
%j - 一年的第几天 (001..366)
%m - 月 (01..12)
%w - 一个星期的第几天 (0 代表星期天)
%W - 一年的第几个星期 (00..53, 星期一为第一天)
%x - 显示日期的格式 (2012年03月27日)
%y - 年的最后两个数字 (1999 则是 99)
%Y - 年 (1970, 1996 等)
================================================================================
#!/bin/sh

# usage: yesterday
# 昨天
# 比如今天是2010年2月27日,那么结果就是2010-02-26
yesterday()
{
  date --date='1 day ago' +%Y-%m-%d
}

# usage: today
# 今天
# 比如今天是2010年2月27日,那么结果就是2010-02-27
today()
{
  date +%Y-%m-%d
}

# usage: now
# 现在,包括日期和时间、纳秒
# 比如:2010-02-27 11:29:52.991774000
now()
{
  date "+%Y-%m-%d %H:%M:%S.%N"
}

# usage: curtime
# 当前时间,包括日期和时间
# 比如:2010-02-27 11:51:04
curtime()
{
  date '+%Y-%m-%d %H:%M:%S'
  # 也可写成:date '+%F %T'
}

# usage: last_month
# 取上个月的年月
# 比如:2010-01
last_month()
{
  date --date='1 month ago' '+%Y-%m'
}

# usage: last_month_packed
# 取上个月的年月
# 比如:201001
last_month_packed()
{
  date --date='1 month ago' '+%Y%m'
}

# usage: first_date_of_last_month
# 取上个月的第一天
# 比如本月是2010年2月,那么结果就是2010-01-01
first_date_of_last_month()
{
  date --date='1 month ago' '+%Y-%m-01'
}

# usage: last_date_of_last_month
# 取上个月的最后一天
# 比如当前是2010年2月,那么结果就是2010-01-31
last_date_of_last_month()
{
  date --date="$(date +%e) days ago" '+%Y-%m-%d'
}

# usage: day_of_week
# 今天的星期
# day of week (0..6);  0 represents Sunday
day_of_week()
{
  date +%w
}

# usage: last_hour
# 上个小时
# 比如:2010-02-27-10
# 适合处理log4j生成的日志文件名
last_hour()
{
  date --date='1 hour ago' +%Y-%m-%d-%H
}

# usage: the_hour
# 当前的小时,为方便算术比较,结果不以0开头
# 比如:12
the_hour()
{
  #date +%H  # hour (00..23)
  date +%k  # hour ( 0..23)
}

# usage: the_minute
# 当前的分钟,为方便算术比较,结果不以0开头
# 比如:
the_minute()
{
  MM=$(date +%M)  # minute (00..59)
  echo $[1$MM-100]
}

# usage: the_second
# 当前的秒数
# 比如:
the_second()
{
  SS=$(date +%S)  # second (00..60); the 60 is necessary to accommodate a leap  second
  echo $[1$SS-100]
}

# usage: the_year
# 当前的年份 year (1970...)
# 比如:2010
the_year()
{
  date +%Y
}

# usage: the_month
# 当前的月份,为方便算术比较,结果不以0开头
# 比如:2
the_month()
{
  M=$(date +%m) # month (01..12)
  echo $[1$M-100]
}

# usage: the_date
# 当前的日期,为方便算术比较,结果不以0开头
# 比如:27
the_date()
{
  date +%e  # day of month, blank padded ( 1..31)
}

# usage: days_ago
# 取n天前的日期
# 比如:days_ago 0就是今天,days_ago 1就是昨天,days_ago 2就是前天,days_ago -1就是明天
# 格式:2010-02-27
days_ago()
{
  date --date="$1 days ago" +%Y-%m-%d
}

# usage: chinese_date_and_week()
# 打印中文的日期和星期
# 比如:2月27日 星期六
chinese_date_and_week()
{
  WEEKDAYS=(星期日 星期一 星期二 星期三 星期四 星期五 星期六)
  WEEKDAY=$(date +%w)
  #DT="$(date +%Y年%m月%d日) ${WEEKDAYS[$WEEKDAY]}"  
  MN=1$(date +%m)
  MN=$[MN-100]
  DN=1$(date +%d)
  DN=$[DN-100]
  DT="$MN月$DN日 ${WEEKDAYS[$WEEKDAY]}"
  echo "$DT"
}

# usage: rand_digit
# 随机数字,0-9
rand_digit()
{
  S="$(date +%N)"
  echo "${S:5:1}"
}

# usage: seconds_of_date [ [
# 获取指定日期的秒数(自1970年)
# 比如:seconds_of_date "2010-02-27" 返回 1267200000
seconds_of_date()
{
  if [ "$1" ]; then
  date -d "$1 $2" +%s
  else
  date +%s
  fi
}

# usage: date_of_seconds
# 根据秒数(自1970年)得到日期
# 比如:date_of_seconds 1267200000 返回 2010-02-27
date_of_seconds()
{
  date -d "1970-01-01 UTC $1 seconds" "+%Y-%m-%d"
}

# usage: datetime_of_seconds
# 根据秒数(自1970年)得到日期时间
# 比如:datetime_of_seconds 1267257201 返回 2010-02-27 15:53:21
datetime_of_seconds()
{
  date -d "1970-01-01 UTC $1 seconds" "+%Y-%m-%d %H:%M:%S"
}

# usage: leap_year
# 判断是否闰年
# 如果yyyy是闰年,退出码为0;否则非0
# 典型示例如下:
# if leap_year 2010; then
#   echo "2010 is leap year";
# fi
# if leap_year 2008; then
#   echo "2008 is leap year";
# fi
# 摘自脚本:datetime_util.sh (2007.06.11)
# 注:这个脚本来自网络,略有修改(原脚本从标准输入获取年份,现改成通过参数指定)
# Shell program to read any year and find whether leap year or not
# -----------------------------------------------
# Copyright (c) 2005 nixCraft project
# This script is licensed under GNU GPL version 2.0 or above
# -------------------------------------------------------------------------
# This script is part of nixCraft shell script collection (NSSC)
# Visit http://bash.cyberciti.biz/ for more information.
# -------------------------------------------------------------------------
leap_year()
{
  # store year
  yy=$1
  isleap="false"

  #echo -n "Enter year (yyyy) : "
  #read yy

  # find out if it is a leap year or not

  if [ $((yy % 4)) -ne 0 ] ; then
  : #  not a leap year : means do nothing and use old value of isleap
  elif [ $((yy % 400)) -eq 0 ] ; then
  # yes, it's a leap year
  isleap="true"
  elif [ $((yy % 100)) -eq 0 ] ; then
  : # not a leap year do nothing and use old value of isleap
  else
  # it is a leap year
  isleap="true"
  fi
  #echo $isleap
  if [ "$isleap" == "true" ]; then
  #  echo "$yy is leap year"
  return 0
  else
  #  echo "$yy is NOT leap year"
  return 1
  fi
}

# usage: validity_of_date

# 判断yyyy-mm-dd是否合法的日期
# 如果是,退出码为0;否则非0
# 典型示例如下:
# if validity_of_date 2007 02 03; then
#   echo "2007 02 03 is valid date"
# fi
# if validity_of_date 2007 02 28; then
#   echo "2007 02 28 is valid date"
# fi
# if validity_of_date 2007 02 29; then
#   echo "2007 02 29 is valid date"
# fi
# if validity_of_date 2007 03 00; then
#   echo "2007 03 00 is valid date"
# fi
# 摘自脚本:datetime_util.sh (2007.06.11)
# 注:这个脚本来自网络,略有修改(原脚本从标准输入获取年月日,现改成通过参数指定)
# Shell program to find the validity of a given date
# -----------------------------------------------
# Copyright (c) 2005 nixCraft project
# This script is licensed under GNU GPL version 2.0 or above
# -------------------------------------------------------------------------
# This script is part of nixCraft shell script collection (NSSC)
# Visit http://bash.cyberciti.biz/ for more information.
# -------------------------------------------------------------------------
validity_of_date()
{
  # store day, month and year
  yy=$1
  mm=$2
  dd=$3

  # store number of days in a month
  days=0

  # get day, month and year
  #echo -n "Enter day (dd) : "
  #read dd

  #echo -n "Enter month (mm) : "
  #read mm

  #echo -n "Enter year (yyyy) : "
  #read yy

  # if month is negative (<0) or greater than 12
  # then it is invalid month
  if [ $mm -le 0 -o $mm -gt 12 ]; then
  #echo "$mm is invalid month."
  return 1
  fi

  # Find out number of days in given month
  case $mm in
  1) days=31;;
  01) days=31;;
  2) days=28 ;;
  02) days=28 ;;
  3) days=31 ;;
  03) days=31 ;;
  4) days=30 ;;
  04) days=30 ;;
  5) days=31 ;;
  05) days=31 ;;
  6) days=30 ;;
  06) days=30 ;;
  7) days=31 ;;
  07) days=31 ;;
  8) days=31 ;;
  08) days=31 ;;
  9) days=30 ;;
  09) days=30 ;;
  10) days=31 ;;
  11) days=30 ;;
  12) days=31 ;;
  *) days=-1;;
  esac

  # find out if it is a leap year or not

  if [ $mm -eq 2 ]; then # if it is feb month then only check of leap year
  if [ $((yy % 4)) -ne 0 ] ; then
    : #  not a leap year : means do nothing and use old value of days
  elif [ $((yy % 400)) -eq 0 ] ; then
    # yes, it's a leap year
    days=29
  elif [ $((yy % 100)) -eq 0 ] ; then
    : # not a leap year do nothing and use old value of days
  else
    # it is a leap year
    days=29
  fi
  fi

  #echo $days

  # if day is negative (<0) and if day is more than
  # that months days then day is invaild
  if [ $dd -le 0 -o $dd -gt $days ]; then
  #echo "$dd day is invalid"
  return 3
  fi

  # if no error that means date dd/mm/yyyy is valid one
  #echo "$dd/$mm/$yy is a vaild date"
  #echo "$yy-$mm-$dd is a valid date"
  #echo "valid"
  return 0
}

# usage: days_of_month
# 获取yyyy年mm月的天数,注意参数顺序
# 比如:days_of_month 2 2007 结果是28
days_of_month()
{
  # store day, month and year
  mm=$1
  yy=$2

  # store number of days in a month
  days=0

  # get day, month and year
  #echo -n "Enter day (dd) : "
  #read dd

  #echo -n "Enter month (mm) : "
  #read mm

  #echo -n "Enter year (yyyy) : "
  #read yy

  # if month is negative (<0) or greater than 12
  # then it is invalid month
  if [ $mm -le 0 -o $mm -gt 12 ]; then
  #echo "$mm is invalid month."
  echo -1
  return 1
  fi

  # Find out number of days in given month
  case $mm in
  1) days=31;;
  01) days=31;;
  2) days=28 ;;
  02) days=28 ;;
  3) days=31 ;;
  03) days=31 ;;
  4) days=30 ;;
  04) days=30 ;;
  5) days=31 ;;
  05) days=31 ;;
  6) days=30 ;;
  06) days=30 ;;
  7) days=31 ;;
  07) days=31 ;;
  8) days=31 ;;
  08) days=31 ;;
  9) days=30 ;;
  09) days=30 ;;
  10) days=31 ;;
  11) days=30 ;;
  12) days=31 ;;
  *) days=-1;;
  esac

  # find out if it is a leap year or not

  if [ $mm -eq 2 ]; then # if it is feb month then only check of leap year
  if [ $((yy % 4)) -ne 0 ] ; then
    : #  not a leap year : means do nothing and use old value of days
  elif [ $((yy % 400)) -eq 0 ] ; then
    # yes, it's a leap year
    days=29
  elif [ $((yy % 100)) -eq 0 ] ; then
    : # not a leap year do nothing and use old value of days
  else
    # it is a leap year
    days=29
  fi
  fi

  echo $days
}
================================================================================
#!/bin/sh

. ./datetime.sh

echo "当前时间(date):$(date)"
echo "昨天(yesterday):$(yesterday)"
echo "今天(today):$(today)"
echo "现在(now):$(now)"
echo "现在(curtime):$(curtime)"
echo "上月(last_month):$(last_month)"
echo "上月(last_month_packed):$(last_month_packed)"
echo "上月第一天(first_date_of_last_month):$(first_date_of_last_month)"
echo "上月最后一天(last_date_of_last_month):$(last_date_of_last_month)"
echo "今天星期几(day_of_week):$(day_of_week)"
echo "上个小时(last_hour):$(last_hour)"
echo "当前的小时(the_hour):$(the_hour)"
echo "当前的分钟(the_minute):$(the_minute)"
echo "当前的秒钟(the_second):$(the_second)"
echo "当前的年份(the_year):$(the_year)"
echo "当前的月份(the_month):$(the_month)"
echo "当前的日期(the_date):$(the_date)"
echo "前天(days_ago 2):$(days_ago 2)"
echo "明天(days_ago -1):$(days_ago -1)"
echo "后天(days_ago -2):$(days_ago -2)"
echo "十天前的日期(days_ago 10):$(days_ago 10)"
echo "中文的日期星期(chinese_date_and_week):$(chinese_date_and_week)"
echo "随机数字(rand_digit):$(rand_digit)"
echo "随机数字(rand_digit):$(rand_digit)"
echo "自1970年来的秒数(seconds_of_date):$(seconds_of_date)"
echo "自1970年来的秒数(seconds_of_date 2010-02-27):$(seconds_of_date 2010-02-27)"
echo "自1970年来的秒数(seconds_of_date 2010-02-27 15:53:21):$(seconds_of_date 2010-02-27 15:53:21)"
echo "自1970年来的秒数对应的日期(date_of_seconds 1267200000):$(date_of_seconds 1267200000)"
echo "自1970年来的秒数对应的日期时间(datetime_of_seconds 1267257201):$(datetime_of_seconds 1267257201)"

if leap_year 2010; then
  echo "2010年是闰年";
fi
if leap_year 2008; then
  echo "2008年是闰年";
fi
if validity_of_date 2007 02 03; then
  echo "2007 02 03 日期合法"
fi
if validity_of_date 2007 02 28; then
  echo "2007 02 28 日期合法"
fi
if validity_of_date 2007 02 29; then
  echo "2007 02 29 日期合法"
fi
if validity_of_date 2007 03 00; then
  echo "2007 03 00 日期合法"
fi

echo "2010年2月的天数(days_of_month 2 2010):$(days_of_month 2 2010)"
echo "2008年2月的天数(days_of_month 2 2008):$(days_of_month 2 2008)"
================================================================================

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22558114/viewspace-1097809/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 生成随机数
下一篇: 英文大小写转换
请登录后发表评论 登录
全部评论

注册时间:2009-09-18

  • 博文量
    164
  • 访问量
    320309