fuinei 发表于 2012-10-15 18:30:00

[已解决]关于时间格式的问题

本帖最后由 fuinei 于 2012-10-20 14:31 编辑

各位好,请问AU3有没有函数可以把12小时制的时间转换为24小时制的时间呢?如1:30PM,转换为13:30

user3000 发表于 2012-10-15 19:17:54

本帖最后由 user3000 于 2012-10-15 19:20 编辑

自己稍稍处理一下就有了. 可以说是普通字符串处理而已. 当然用正则就简洁一点, 比如:$t = '1:30PM'
If StringInStr($t, 'PM') Then MsgBox(0, '',(StringRegExpReplace($t, ':.+$', '') + 12 ) & StringRegExpReplace($t, '^\d+|[^:\d]', ''))

netegg 发表于 2012-10-15 19:20:13

本帖最后由 netegg 于 2012-10-15 21:40 编辑

stringleft($time, stringinstr($time, ':') - 1) + BitAND(stringinstr($time, 'm'), 1)*12 & Stringmid($time, stringinstr($time, ':'),stringinstr($time, ':')+1)
尽管有些胡闹

netegg 发表于 2012-10-15 19:28:46

回复 2# user3000
12小时制-->24进制,这个正则不对

user3000 发表于 2012-10-15 19:31:29

回复 4# netegg


   是的,最早发的没去掉'PM'两字母,刚发出来就发现了. 老大是指这个否?

netegg 发表于 2012-10-15 19:33:55

本帖最后由 netegg 于 2012-10-15 19:42 编辑

回复 5# user3000
或者不应该说不对,是后面那个+12还要处理下
你试试看,1:20am或者1:20

user3000 发表于 2012-10-15 21:17:33

回复 6# netegg

哦, 是没考虑不用+12的情况.
那就要加多判断语句了.
$t = '1:30AM'
If StringInStr($t, 'PM') Then
MsgBox(0, '',(StringRegExpReplace($t, ':.+$', '') + 12 ) & StringRegExpReplace($t, '^\d+|[^:\d]', ''))
Else
        MsgBox(0, '', StringRegExpReplace($t, '[[:alpha:]]', ''))
EndIf

fuinei 发表于 2012-10-16 11:38:04

本帖最后由 fuinei 于 2012-10-16 11:39 编辑

我的原意是想了解AU3有没有现成的函数或UDF可实现该功能,没想到user3000兄的netegg元谷已给出函数,谢谢两位!
我的基础不好,正则还看不太懂,使用user3000兄的代码测试仍存在点问题,如12:59:00 AM 24小时制应该是00:59:00,而12:59:00 PM应该是12:59:00,我使用字符串转换的测试代码如下:
Local $Time_ex
$Time = '12:30:05 PM'
$Time_ex = StringSplit($Time,":")
$Hour = $Time_ex
$Minute = $Time_ex
$Second = StringSplit($Time_ex," ")

Select
        Case StringInStr($Time,"12") And StringInStr($Time,"AM")
                $Time = "00:" & $Minute & ":" & $Second
        Case StringInStr($Time,"12") And StringInStr($Time,"PM")
                $Time = $Hour & ":" & $Minute & ":" & $Second
        Case StringInStr($Time,"AM")
                $Time = $Hour & ":" & $Minute & ":" & $Second
        Case StringInStr($Time,"PM")
                $Time = $Hour + 12 & ":" & $Minute & ":" & $Second
EndSelect
MsgBox("","",$Time)
请问user3000兄能否帮忙改改你的代码呢?

netegg 发表于 2012-10-16 13:12:58

本帖最后由 netegg 于 2012-10-16 13:14 编辑


Func Convert24h($time, $format)   
If $format = "am" Then Return Mod($time, 12)   
Return Mod($time + 12, 24)
EndFunc

fuinei 发表于 2012-10-16 13:49:26

回复 9# netegg

当时间为12:XX:XX pm 使用该函数返回0,与实际情况不符,按照您的思路增加一些判断也可以实现
$time = '12:58:00 pm'
$format = StringRight($time,2)
$time = StringTrimRight($time,3)
$time_ex = StringSplit($time,":")
$hour = $time_ex
$minute = $time_ex
$second = $time_ex

If $format = "am" Then
        $hour = Mod($hour,12)
ElseIf $format = "pm" And $hour = 12 Then       
        $hour = $hour
Else
        $hour = Mod($hour + 12, 24)
EndIf

If $hour = 0 Then $hour = "00"
$time = $hour & ":" & $minute & ":" & $second

MsgBox("","",$time)
对字符的处理应该还是使用正则最为简洁

netegg 发表于 2012-10-16 14:55:54

本帖最后由 netegg 于 2012-10-16 16:21 编辑

回复 10# fuinei


$time = '12:58:00'

MsgBox("","", StringRegExpReplace(Convert24h($time) & StringTrimLeft($time, StringInStr($time, ':')-1), 'pm|am', ''))


Func Convert24h($time)   
If StringInStr($time, "pm") Then Return Mod($time, 12)+12   
Return Mod($time, 24)
EndFunc

好像反了,自己再试试吧

netegg 发表于 2012-10-16 16:25:35

另外,现成的函数也有,不过不比这样简单,相对来说可能更麻烦,_winapi_gettimeformat

fuinei 发表于 2012-10-16 18:24:15

回复 11# netegg

谢谢netegg元老的指导!是的,代码当时间为12:XX:XX AM是返回的结果不正确,稍做修改可以了
$time = '12:01:00 AM'

MsgBox("","", StringRegExpReplace(Convert24h($time) & StringTrimLeft($time, StringInStr($time, ':')-1), 'PM|AM', ''))


Func Convert24h($time)
If StringInStr($time, "AM") And StringInStr($time, "12") Then Return("00")
If StringInStr($time, "PM") Then Return Mod($time, 12)+12   
Return Mod($time, 24)
EndFunc
看来最简单的方式还是正则,请问各位有没有比较好学习正则的文章,论坛上很多学习正则的附件下载后都打不开的。

netegg 发表于 2012-10-16 19:01:54

有12:XX:XX AM这个时间吗

netegg 发表于 2012-10-16 19:04:19

本帖最后由 netegg 于 2012-10-16 19:15 编辑

0:00:00~11:59:59对应的是12小时制的am
12:00:00~23:59:59对应的是12小时制的pm
还有这里面的正则不是用于替换数字,是为了删除后面的字符,和时制变换无关
页: [1] 2
查看完整版本: [已解决]关于时间格式的问题