Windows PowerShell每周提示(21):有关日期(和时间)的更多乐趣
这是什么?我们是否知道关于Windows PowerShell cmdlet Get-Date的任何事?哦,是的,毕竟,每个人都知道Get-Date cmdlet。除了,要知道什么样的内容。Get-Date cmdlet使你能够得到一个日期时间值。需要知道现在的日期和时间么?那么只需这么做:
作为结果,使得$a等于以下内容(或其它类似的内容):
| Thursday, October 25, 2007 1:50:4 PM |
现在变量$a是一个包含当前日期和时间的日期时间对象。想要得到一个等于不同的日期和时间的日期时间对象?好的,试试以下命令:
| $a = Get-Date "5/1/2006 7:00 AM" |
这就是全部了吧,对么?
嗯,我们说了,“对么?”
错,还不止这些。
使用Get-Date访问其它日期属性
事实证明,你能用Get-Date做一些其它的酷事。比如?好的,看下以下脚本,这个脚本梳理出日期时间值的每个独立部分:
| $a = Get-Date "Day: " + $a.Day "Month: " + $a.Month "Year: " + $a.Year "Hour: " + $a.Hour "Minute: " + $a.Minute "Second: " + $a.Second |
当我们在2007年10月25日1点50分4秒时运行这个脚本时,我们将得到以下内容:
| Day : 25 Month : 10 Year : 2007 Hour : 13 Minute: 50 Second: 4 |
看见有多么简单了吧?我们只是指定我们感兴趣的日期时间属性,然后PowerShell关心剩下的部分。如果我们关心这些属性中的一个,例如,仅仅是日,我们甚至可以用一行代码来完成这件事:
这里没有什么太有想象力的事,我们简单的调用Get-Date cmdlet,并将命令用括号括起来保证PowerShell在执行其它代码之前优先获得日期。我们然后抓取Day属性的值,并且只是这个值,然后将值赋给变量$a。这使得$a等于以下内容:
你知道。这很有趣,不是么?让我们再试试另一个。让我们看看我们是否能提取出仅包含日期或者仅包含时间的值:
| $a = Get-Date "Date: " + $a.ToShortDateString() "Time: " + $a.ToShortTimeString() |
下面是我们所得到的:
| Date: 10/25/2007 Time: 1:55 PM |
就像你可能注意到的,这次我们调用了一对方法:ToShortDateString 及 ToShortTimeString。但是最终的结果是非常相似的,我们能够简单提取出日期时间值的一部分。
但是我们可以做比从当前日期和时间中提取秒或者毫秒之外更多的事。例如,思考这几个问题:
l 现在还是夏时制么?
l 我知道今天是25号,但是是星期几呢?
l 10月25号是一年当中的第几天呢?
虽然有很多问题,但是Windows PowerShell能提供很多答案。只要你调用Get-Date cmdlet然后请求合适的属性值。你知道的,像这样:
| $a = Get-Date "Daylight Saving Time: " + $a.IsDaylightSavingTime() "Day of Week: " + $a.DayOfWeek "Day of Year: " + $a.DayOfYear |
下面是这个脚本的输出:
| Daylight Saving Time: True Day of Week: Thursday Day of Year: 298 |
哇,离圣诞节还有剩下不到70天的购物日了。如果你需要知道脚本专家们的尺码和喜欢的颜色,那么就联系我们吧。
这是另外一个有可能是手到擒来的小方法。当处理日期和时间时大型组织总是会遇到问题,这是因为这些公司大多是跨越好几个时区。处理这个问题的一种方法是,转换日期和时间至通用时,使用这个办法,你能将本地时,像2007年10月25日1点50分45秒,转换至格林尼治标准时间(也就是说是英格兰格林尼治地区的时间,而不是你所在地的时间。)
当然,转换本地时间至通用时间能够很复杂:你需要知道你的“偏移量”(即你的时间和格林尼治时间的差异数);你需要知道偏移量的方向(我们比格林尼治时间早4个小时还是晚四个小时);你需要处理是否采用夏时制还是标准时间。你……好的,你知道了,这件事可以变得很复杂。
或者,也能很简单:
| $a = Get-Date "Universal Time: " + $a.ToUniversalTime() |
如你所见,我们在这里所做的是得到我们的本地时间然后应用ToUniversalTime()方法;这将自动将本地时间显示为格林尼治时间。换句话说,时间将以以下方式被显示:
| Thursday, October 25, 2007 8:50:04 PM |
像我们所说的,毕竟不是那么复杂。
简单的日期算术
这里是你在使用Get-Date时的另外一个酷技巧。对系统管理员而言这是在不久的将来很容易预见到的。例如,假设,你正在为季节性雇员创建新账户。这些账户在90天后过期。这很好,除了一件事:2007年10月25号的90天后是哪一天?
事实上,是这一天:
| Wednesday, January 23, 2008 1:50:04 PM |
在你问之前,脚本专家们不能预见未来。如果我们能,我们将在predicting who would win this year’s World Series中做的更好一点。然而,我们能做的,是调用AddDays方法,传递90(代表90天)作为方法的参数:
| $a = Get-Date $a.AddDays(90) |
不用多说,这将返回自今日起90天后的日期。那么你知道离今日90天前的日期么?在这种情况下,传递-90作为方法参数:
| $a = Get-Date $a.AddDays(-90) |
试一下看看会发生什么。
顺便说一句,你被限制为不能从日期中加上或者减去分钟。你也有以下方法能用:
l AddDays
l AddHours
l AddMilliseconds
l AddMinutes
l AddMonths
l AddSeconds
l AddTicks
l AddYears
你甚至也能做空想日期算术,但不能和Get-Date cmdlet一起使用。(取而代之的是,你需要使用New-Timespan cmdlet。)但是这是另一周的话题了。
PowerShell奖励提示:获得日/月名称的数组
实话对你说,Get-Date cmdlet对此无能为力,但是我们决定把这部分内容添加之本周的提示是因为我们觉得这部分内容很有趣。.NET Framework类System.Globalization.DateTimeFormatInfo是被设计为用来返回关于日期时间格式及计算机上配置的大量信息。例如,假设你运行以下这个简单的两行脚本:
| $a = new-object system.globalization.datetimeformatinfo $a |
你将得到以下类似的信息:
| AMDesignator : AM Calendar : System.Globalization.GregorianCalendar DateSeparator : / FirstDayOfWeek : Sunday CalendarWeekRule : FirstDay FullDateTimePattern : dddd, dd MMMM yyyy HH:mm:ss LongDatePattern : dddd, dd MMMM yyyy LongTimePattern : HH:mm:ss MonthDayPattern : MMMM dd PMDesignator : PM RFC1123Pattern : ddd, dd MMM yyyy HH':'mm':'ss 'GMT' ShortDatePattern : MM/dd/yyyy ShortTimePattern : HH:mm SortableDateTimePattern : yyyy'-'MM'-'dd'T'HH':'mm':'ss TimeSeparator : : UniversalSortableDateTimePattern : yyyy'-'MM'-'dd HH':'mm':'ss'Z' YearMonthPattern : yyyy MMMM AbbreviatedDayNames : {Sun, Mon, Tue, Wed...} ShortestDayNames : {Su, Mo, Tu, We...} DayNames : {Sunday, Monday, Tuesday, Wednesday... AbbreviatedMonthNames : {Jan, Feb, Mar, Apr...} MonthNames : {January, February, March, April...} IsReadOnly : False NativeCalendarName : Gregorian Calendar AbbreviatedMonthGenitiveNames : {Jan, Feb, Mar, Apr...} MonthGenitiveNames : {January, February, March, April...} |
显而易见是非常有用的,尤其对那些在跨国组织中工作的人。
但是几乎任何人都能找到DayNames及MonthNames属性的用处(也包括相关的属性AbbreviatedDayNames, AbbreviatedMonthNames, and ShortestDayNames)。这些属性对你来说有何种用途呢?好的,对脚本编写者而言需要一个包含一周内所有日期的名称并不奇怪。如果你想要,你能使用下面的代码来手动建立一个数组:
| $a = "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday" |
或者,你能够让DateTimeFormatInfo类为你建构该数组:
| $a = new-object system.globalization.datetimeformatinfo $b = $a.DayNames $b |
对月名称而言也是可行的:
| $a = new-object system.globalization.datetimeformatinfo $b = $a.MonthNames $b |
运行这个脚本你将得到以下内容:
| January February March April May June July August September October November December |
我们想这也是很酷的。
下周见。
英文原文
http://www.microsoft.com/technet/scriptcenter/resources/pstips/oct07/pstip1026.mspx