2019独角兽企业重金招聘Python工程师标准>>>

一个日期命令最基本的需求就是显示你所在时区的日期和时间。但是如果你有用户是跨时区的呢?或者,如果你有朋友或是同事时在不同的地区呢?你就会一直搞不清楚那儿现在到底是个什么日子了,比如卡萨布兰卡、梵蒂冈或是悉尼。

现在大部分的Unix系统都有一个date命令,它的后台是一个时区数据库。它的位置一般是在目录/usr/share/zoneinfo下,它列出了超过250个不同的地区,并且可以明确表示出各个不同地区的时间。因为date命令注重的是时间变量TZ,该变量可以被设置为不同的已知地区,那么核心的功能可以通过如下表示:
TZ="Africa/Casablanca" date
   通过一个shell脚本,我们可以创建一个对用户界面友好的时区数据库:要知道,大部分系统用户并不喜欢临时设置环境变量

代码:

#!/bin/sh# timein.sh -- 显示特定时区或是地区的时间.# 如果没有提供任何参数,就显示 UTC/GMT.# 使用单词"list"来查看已知地区列表# 注意:有可能匹配到地区,但只有时区是合法的。# 时区数据库网址: http://www.twinsun.com/tz/tz-link.htmzonedir="/usr/share/zoneinfo"if [ ! -d $zonedir ]; thenecho "No time zone database at $zonedir." >&2exit 1fiif [ -d "$zonedir/posix" ]; thenzonedir=$zonedir/posix  # 现代Linux系统fiif [ $# -eq 0 ]; thentimezone="UTC"mixedzone="UTC"elif [ "$1" = "list" ]; then(echo "All known time zones and regions defined on this system:"cd $zonedirfind * -type f -print | xargs -n 2 | \awk '{printf "%-38s %-38s\n", $1, $2}'    ) | moreexit 0elseregion="$(dirname $1)"  # 如果参数格式是 Asia/Beijing,那region是Asiazone="$(basename $1)"   # 如果参数格式是 Beijing,那region就是个点# 恰好可以匹配?非常好。否则我们需要探索一番。# 从计算匹配的个数开始。matchcnt="$(find $zonedir/$region -name $zone -type f -print |wc -l | sed 's/[^[:digit:]]//g')"  #上面的查找路径,应该加上$region,否则查找的不精确。书中没有。#比如给出形如 Asia/Beijing 的参数,如果路径中没有Asia,那永远也查不到北京if [ "$matchcnt" -gt 0 ]; then  # 至少一个文件匹配if [ "$matchcnt" -gt 1 ]; then  # 超过一个文件匹配echo "\"$zone\" matches more than one possible time zone record." >&2echo "Please use 'list' to see all known regions and time zones." >&2exit 1fimatch="$(find $zonedir -name $zone -type f -print)"mixedzone="$zone"else# 第一个字母大写,其余单词小写: region + zonemixedregion="$(echo ${region%${region#?}} | tr '[[:lower:]]' '[[:upper:]]')\$(echo ${region#?} | tr '[[:upper:]]' '[[:lower:]]')"  #行头千万别留下空格或者制表符mixedzone="$(echo ${zone%${zone#?}} | tr '[[:lower:]]' '[[:upper:]]')\$(echo ${zone#?} | tr '[[:upper:]]' '[[:lower:]]')"    #行头千万别留下空格或者制表符if [ "$mixedregion" != "." ]; then# 只查特定地方# 当有多种可能性时,让用户指定唯一匹配项(比如"Atlantic")match="$(find $zonedir/$mixedregion -name $mixedzone -type f -print)"elsematch="$(find $zonedir -name $mixedzone -type f -print)"fiif [ -z "$match" ]; thenif [ ! -z "$(find $zonedir -name $mixedzone -type d -print)" ]; thenecho \"The region \"$1\" has more than one time zone. Please use 'list'" >&2else  # 没有一个匹配echo "Can't find an exact match for \"$1\". Please use 'list'" >&2fiecho "to see all known regions and time zones." >&2exit 1fifitimezone="$match"finicetz=$(echo $timezone | sed "s|$zonedir/||g")echo It\'s $(TZ=$timezone date '+%A, %B %e, %Y, at %l:%M %p') in $nicetzexit 0

脚本如何工作:
    这个脚本利用的就是date命令来显示日期和时间。事实上,这整个脚本关注的就是要确认好你给的时区名,这样在脚本的最后才能如期运行好。
这个脚本最复杂的地方来自预测由用户输入的,不匹配时区数据库中的任一个名字的地区名。时区数据库会按照时区名按地区列排好,在有典型的输入问题时,脚本也会试图报有用的错误信息。
    比如,虽然TZ="Casablanca"并不嫩成功的查找到一个匹配的地区,而date命令会演示GMT,城市Casablanca确实是存在于地区数据库中的。可能的名字,Africa/Casablanca,就会被提供给这个脚本。脚本会找到非洲目录下的卡萨布兰卡,然后正确的确认这个地区。指定"Africa",从另一面来说,脚本知道有分区,只提供那些信息不足以唯一指定一个时区。
最后,你同样可以使用一个时区名(比如,UTC、WET)作为脚本参数来查看定义好的时区的子集。
   注意,一个非常棒的时区数据库的参考资料在线:http://www.twinsun.com/tz/tz-link.htm

注:UTC是协调世界时(Universal Time Coordinated)英文缩写,北京时间比UTC时间早8小时。GMT(Greenwich Mean Time)是格林尼治平时。

运行脚本:

./timein.sh It's 星期一, 十二月 24, 2012, at 12:19 上午 in UTC./timein.sh LondonIt's 星期一, 十二月 24, 2012, at 12:19 上午 in Europe/London./timein.sh BrazilThe region "Brazil" has more than one time zone. Please use 'list'to see all known regions and time zones../timein.sh Pacific/HonoluluIt's 星期日, 十二月 23, 2012, at 2:21 下午 in Pacific/Honolulu./timein.sh WETIt's 星期一, 十二月 24, 2012, at 12:21 上午 in WET./timein.sh myclosetCan't find an exact match for "mycloset". Please use 'list'to see all known regions and time zones.

转载于:https://my.oschina.net/u/578519/blog/100981

第二章:Improving On User Commands--22.显示不同时区的时间相关推荐

  1. 第二章 python-pcl、open3d读取、显示pcd、bin等格式点云数据

    第二章 python-pcl.open3d读取.显示pcd.bin格式点云数据 文章目录 第二章 python-pcl.open3d读取.显示pcd.bin格式点云数据 前言 环境 一.点云数据类型 ...

  2. 《Python编程:从入门到实践》第二章练习题

    <Python编程:从入门到实践>第二章练习题 <Python编程:从入门到实践>第二章练习题 1-1 简单消息 2-2 多条简单消息 2-3 个性化消息 2-4 调整名字的大 ...

  3. 第二章 一种操作系统的诞生

    第二章 一种操作系统的诞生 1. 有些人记忆时间的方法是通过他们曾经驾驶过什么样的车子,干过什么样的工作,或在什么地方住过,以及追求过什么样的情人.而我的生涯却是由电脑来划分的. 我成长期间只有过三台 ...

  4. linux下显示其他时区时间

    时区的系统常见定义: unix系统时区设置: 每个用户可以使用环境变量TZ来设置与系统不同的时区,这个设置将覆盖系统的设置.执行date命令,显示与系统不同的时区时间. 常见的系统时区定义: Time ...

  5. 数字图像处理:第二章 图象获取、显示、表示与处理

    第二章 图象获取.显示.表示与处理 图象获取是图象的数字化过程,显示则是将数字图象转化为适合人们使用的形式,而处理是通过软件对图象进行变换操作的过程. 目录 图象获取 图象显示 图象表示 图象处理 参 ...

  6. 运用计算机辅助电话调查的方法,第二章 统计数据的搜集、整理与显示

    "对统计学家来说,当今是统计学一切最重要活动的最重要的时期." "在花费同样的时间和劳动下,完整细致地检查数据的收集过程,或者说试验过程,常常会增加10倍或12倍的收益. ...

  7. [转载]Programming MS Office 2000 Web Components第二章第三节

    第二章第三节 编程模型要点 现在总结一下我们对电子表格组件的介绍,我将讲述(电子表格)控件编程模型的各个要点,以便您了解如何运用这个控件,以及当您需要编写脚本来实现不同的功能时该如何去做.本节不是编程 ...

  8. Solaris培训第二章:OpenBoot PROM(转)

    Solaris培训第二章:OpenBoot PROM(转) OpenBoot PROM介绍 所有Sun机器都一个用于基本硬件测试和初始化的固件,还有一个提供多种重要功能的用户程序. 基本元素 Sun系 ...

  9. 【编程珠玑】读书笔记 第二章 算法

    2013-07-11 22:00:28 第二章 算法 本章围绕三个问题进行算法讨论,包括元素的查找.字符串的旋转.以及变位词的查找. 下面给出了实现代码.以及测试结果. 问题一 查找不存在的元素 思路 ...

最新文章

  1. 读书笔记之:C/C++程序员实用大全—C/C++最佳编程指南
  2. Oracle 数据库误truncate table恢复过程
  3. JavaScript的面向对象原理之原型链
  4. MATLAB图形插入标题
  5. IDEA插件系列(84):MultiHighlight插件——高亮代码中的标识符
  6. linux命令大全密码修改,linux修改密码命令
  7. PLC可编程控制器综合实训装置
  8. ACM-ICPC 2018 北京赛区网络预赛 B Tomb Raider(二进制枚举暴力)
  9. 美日开年第二场大演习,这是要给虎年定个调吗
  10. HTML期末作业-电影主题网站介绍
  11. Vue:把组件作为自定义元素来使用以及Identifier ' simple_couter' is not in camel case问题解决
  12. 小程序审核失败:你的小程序涉及提供播放、观看等服务,请补充选择:文娱-其他视频类目。怎么解决呢
  13. 家用计算机硬件升级方案,旧电脑如何升级提速,老电脑升级方案!
  14. SpringCloud+Kubernetes 微服务容器化交付实战(9):JFrog Artifactory安装 配置
  15. 【论文翻译】(UAI 2018)使用感知预测网络进行潜在物理属性的无监督学习
  16. 00_51入门知识累计_C51简介
  17. MMR 算法信息收集
  18. 啥是BGP机房啊,被科普一下!
  19. 炒股秘籍:三句话挣得千万资产
  20. 飞书开放平台-查询已读消息示例

热门文章

  1. 怎样为企业挑选正确的EDR解决方案
  2. 小程序picker组件中的(普通选择器:mode = selector)
  3. Android监听返回键、Home键+再按一次返回键退出应用
  4. 用DevExpress做界面开发:ASP.NET界面开发框架
  5. debug 和release 的区别
  6. [转]VI/VIM的键盘图
  7. ISO9000软件使用管理办法
  8. LeetCode 767. 重构字符串
  9. 如何在K8S上玩转TensorFlow ?
  10. SpringCloud 从菜鸟到大牛之八 服务容错 Hystrix