免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 827 | 回复: 0

[学习共享] 15课:powershell送你一把,解决日期计算类问题的金钥匙! [复制链接]

论坛徽章:
0
发表于 2019-02-22 12:44 |显示全部楼层
powershell送你一把,解决日期计算类问题的金钥匙!
                   -----get-date命令之讲解。

powershell中的日期时间计算命令有get-date,set-date,new-timespan。这里我们主要讲get-date。
get-date 返回的值,有两种格式
get-date  -format     xxx
get-date  -uformat   xxx
分别对应着win和unix,linux
$日期型对象 = get-date '字符串'

-------------------------------------------------【日期字符串格式】-------------------------------------------------

-format 后的参数:
格式说明符        关联属性/说明
d        ShortDatePattern
D        LongDatePattern
f        完整日期和时间(长日期和短时间)
F        FullDateTimePattern(长日期和长时间)
g        常规(短日期和短时间)
G        常规(短日期和长时间)
m、M        MonthDayPattern
o        往返日期/时间模式
r、R        RFC1123Pattern
s        使用当地时间的 SortableDateTimePattern(基于 ISO 8601)
t        ShortTimePattern
T        LongTimePattern
u        UniversalSortableDateTimePattern 用于显示通用时间的格式
U        使用通用时间的完整日期和时间(长日期和长时间)
y、Y        YearMonthPattern

例如:
get-date  -format F



-uformat 后的参数:
c 日期和时间 – 缩写(2006 年 6 月 16 日 星期五 10:31:27)

日期:
D 以 mm/dd/yy 格式显示的日期 (06/14/06)
x 以区域设置的标准格式显示的日期(中文-中国 为 07/09/12)

年份:
C 世纪(2006 的世纪值为 20)
Y 以 4 位格式显示的年份 (2006)
y 以 2 位格式显示的年份 (06)
G 同‘Y’
g 同‘y’

月份:

b 月份名称 - 缩写 (1)
B 月份名称 - 全称(一月)
h 同‘b’
M 月份编号 (06)

周:

W 一年中的周编号 (00-52)
V 一年中的周编号 (01-53)
U 同‘W’

日期:
a 一周中的第几日 - 缩写名称(周一)
A 一周中的第几日 - 全名(星期一)
u 一周中的第几日 - 编号(星期一 = 1)
d 一月中的第几日 - 2 位 (05)
e 一月中的第几日 - 数字前留一空格 ( 5)
j 一年中的第几日 - (1-366)
w 同‘u’

时间:

p 上午或下午
r 以 12 小时格式显示的时间(上午 09:15:36)
R 以 24 小时格式显示的时间 - 不显示秒 (17:45)
T 以 24 小时格式显示的时间 (17:45:52)
X 同‘T’
Z 与通用协调时间 (UTC) 的时差 (-07)

小时:
H 以 24 小时格式显示的小时数 (17)
I 以 12 小时格式显示的小时数 (05)
k 同‘H’
l 同‘I’(大写 I = 小写 L)

分钟和秒:
m 分钟 (35)
S 秒 (05)
s 自 1970 年 1 月 1 日 00:00:00 起过去的秒数 (1150451174.95705)

特殊字符:
n 换行符 (\n)
t 制表符 (\t)


-------------------------------------------------【日期属性方法】-------------------------------------------------
https://docs.microsoft.com/zh-cn ... =netframework-4.7.2
get-date 命令是。net 中System.DateTime类的封装。具体帮助可以去看中文的msdn。

get-date 有下列属性:
Date
Day
DayOfWeek
DayOfYear
Hour
Kind
Millisecond
Minute
Month
Second
Ticks
TimeOfDay
Year
DateTime

get-date 有下列方法:
Add
AddDays
AddHours
AddMilliseconds
AddMinutes
AddMonths
AddSeconds
AddTicks
AddYears
CompareTo
Equals
GetDateTimeFormats
GetHashCode
GetObjectData
GetType
GetTypeCode
IsDaylightSavingTime
Subtract
ToBinary
ToBoolean
ToByte
ToChar
ToDateTime
ToDecimal
ToDouble
ToFileTime
ToFileTimeUtc
ToInt16
ToInt32
ToInt64
ToLocalTime
ToLongDateString
ToLongTimeString
ToOADate
ToSByte
ToShortDateString
ToShortTimeString
2013-08-18 为被bat时间计算困住的菜鸟,写的教程
ToSingle
ToString
ToType
ToUInt16
ToUInt32
ToUInt64
ToUniversalTime

-------------------------------------------------【timespan 计算时间段,时间间隔】-------------------------------------------------

时间差对象,即timespan,在powershell中精度为千分之一秒(毫秒)
new-timespan命令是。net 中 System.TimeSpan类的封装。具体帮助可以去看中文的msdn。

计算30天前的时间:
(get-date).adddays(-30)            ---------   2013年7月19日 14:59:23
((get-date).adddays(-30)).day    ---------   19

New-TimeSpan -Start $开始日期  -End $结束日期


-------------------------------------------------【常用代码】-------------------------------------------------

# 获取最小的日期(通常用于做日期计算)
Get-Date 0

# 获取当前日期
Get-Date

# 获取当前日期的年
(Get-Date).Year

# 获取当前日期的月
(Get-Date).Month

# 获取当前日期的日
(Get-Date).Day

# 获取从今年起的天数
(Get-Date).DayOfYear

# 获取星期
(Get-Date).DayOfWeek

# 今年的第一天
(Get-Date 0).AddYears((Get-Date).Year - 1)

# 今年的最后一天
(Get-Date 0).AddYears((Get-Date).Year).AddDays(-1)

# 这个月的第一天
(Get-Date 0).AddYears((Get-Date).Year - 1).AddMonths((Get-Date).Month - 1)

# 这个月的最后一天
(Get-Date 0).AddYears((Get-Date).Year - 1).AddMonths((Get-Date).Month).AddDays(-1)

$本年 = (get-date).year
$本月 = (get-date).Month
$下月今日_减本月今日等于_本月有几天 = ((Get-Date).addmonths(1) - (Get-Date)).Day
'' + $本年 + $本月 + $下月今日_减本月今日等于_本月有几天



# 这个星期的第一天
(Get-Date 0).AddYears((Get-Date).Year - 1).AddDays(((Get-Date -uformat %V) - 1) * 7)

# 这个星期的最后一天
(Get-Date 0).AddYears((Get-Date).Year - 1).AddDays([int](Get-Date -uformat %V) * 7).AddDays(-1)

上述命令网上摘抄


-------------------------------------------------【取毫秒】-------------------------------------------------

#谁再问你毫秒咋取,你就告诉他有,但意义不大。
(get-date).ToString("MM/dd/yyyy hh:mm:ss.fff tt"

get-date -format "yyyy_MM_dd HH:mm:ss.fff"

另外,目录只有创建时间,这一个跟时间相关的属性。文件有创建,修改,访问时间,三个跟时间相关的属性。

有了powershell打造的金钥匙,你就能尽解所有日期时间计算类问题!

-------------------------------------------------【非标准字符串 ---》日期】-------------------------------------------------

上周脚本题中的难点,如何转换【非标准日期字符串】为日期?
'30/May/2013:17:38:20'
'2011-29-01 12:00 AM'
答:
办法1:重新切割组合字符串,使之称为标准日期格式的字符串。
$a = '30/May/2013:17:38:20' # 这里我们只要把第一个冒号变成空格即可
$b = $a -split ':'
$c = $b[0] + ' ' + $b[1] + ':' + $b[2] + ':' +$b[3]
$c
$d = [datetime]$c
$d


办法2:使用[System.DateTime]::TryParseExact方法。

$特殊日期_字符串 = '30/May/2013:17:38:20'
$特殊日期_格式化模版 = 'dd/MMMM/yyyy:HH:mm:ss'

$返回的日期 = New-Object DateTime
[System.DateTime]::TryParseExact(
$特殊日期_字符串,
$特殊日期_格式化模版,
[System.Globalization.CultureInfo]::InvariantCulture,
[System.Globalization.DateTimeStyles]::None,
[ref]$返回的日期)
$返回的日期


$特殊日期_字符串 = '2011-29-01 12:00 AM'
$特殊日期_格式化模版 = 'yyyy-dd-MM hh:mm tt'

$返回的日期 = New-Object DateTime
[System.DateTime]::TryParseExact(
$特殊日期_字符串,
$特殊日期_格式化模版,
[System.Globalization.CultureInfo]::InvariantCulture,
[System.Globalization.DateTimeStyles]::None,
[ref]$返回的日期)
$返回的日期


$特殊日期_字符串 = '2011-29-01 12:00 PM'
$特殊日期_格式化模版 = 'yyyy-dd-MM hh:mm tt'

$返回的日期 = New-Object DateTime
[System.DateTime]::TryParseExact(
$特殊日期_字符串,
$特殊日期_格式化模版,
[System.Globalization.CultureInfo]::InvariantCulture,
[System.Globalization.DateTimeStyles]::None,
[ref]$返回的日期)
$返回的日期

这里面有一个问题:
2011-29-11,2011-29-1,数字有时只有一位(如1月),有时候2位(11月)。应该只设置1位月的格式(yyyy-dd-M),而不能设置2位('yyyy-dd-MM'),日也是如此。

-------------------------------------------------【日期 《---》 时间戳 】-------------------------------------------------
原创
时间对象--》时间戳
[int][double]:arse((Get-Date (get-date).touniversaltime() -UFormat %s))

$a = New-Object system.DateTimeOffset (get-date)
$a.ToUnixTimeSeconds()



时间戳--》时间对象
Function get-epochDate ($epochDate)
{
    [timezone]::CurrentTimeZone.ToLocalTime(([datetime]'1/1/1970').AddSeconds($epochDate))
}
get-epochDate 1496993325


java时间戳--》.net,powershell时间对象
([datetime]'1/1/1970').AddMilliseconds(1542178523143)  


-------------------------------------------------【日期和时区,日期和地理位置】-------------------------------------------------

$日期格式 = New-Object System.Globalization.CultureInfo "en-us"
$英文日期 = $日期对象.ToString($日期格式)
$英文日期
2/22/2019 11:56:17 AM


$英文日期2 = $日期对象.ToString('ddd',$日期格式)
$英文日期2
Fri


















您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,7折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时七折期:2019年8月31日前


----------------------------------------

大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP