python的time模块不支持单独将字符串格式的分钟数和小时数转换为秒,比如将“5m”转换为“300”(秒),不支持将“0.2h5.1m12.123s”转换为“1038.123”(秒)。

但是这种字符串格式的分钟数或者小时数写法,在一些配置或者用户交互中还是比较有用的。

为了实现这种功能,通过模拟golang的`time`模块中的`ParseDuration(s string) (duration, error)`函数,使用Python代码实现如下:

#-*- coding:utf-8 -*-
import sys
import logging reload(sys) # reload 才能调用 setdefaultencoding 方法
sys.setdefaultencoding('utf-8') # 设置 'utf-8' from cfg import config class TimeTool(object):
def __init__(self):
handler = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s %(name)-12s %(levelname)-8s %(message)s')
handler.setFormatter(formatter)
self.logger = logging.getLogger("HistoryReader")
self.logger.addHandler(handler)
self.logger.setLevel(config.LOG_LEVEL)
self.Nanosecond = 1
self.Microsecond = 1000 * self.Nanosecond
self.Millisecond = 1000 * self.Microsecond
self.Second = 1000 * self.Millisecond
self.Minute = 60 * self.Second
self.Hour = 60 * self.Minute
self.unitMap = {
"ns": int(self.Nanosecond),
"us": int(self.Microsecond),
"µs": int(self.Microsecond), # U+00B5 = micro symbol
"μs": int(self.Microsecond), # U+03BC = Greek letter mu
"ms": int(self.Millisecond),
"s": int(self.Second),
"m": int(self.Minute),
"h": int(self.Hour),
}
pass def leadingInt(self, s):
x, rem, err = int(0), str(""), "time: bad [0-9]*"
i = 0
while i < len(s):
c = s[i]
if c < '0' or c > '9':
break
#print x
if x > (1 << 63-1)/10:
#print "x > (1 << 63-1)/10 => %s > %s" %(x, (1 << 63-1)/10)
return 0, "", err
x = x * 10 + int(c) - int('0')
if x < 0:
#print "x < 0 => %s < 0" %(x)
return 0, "", err
i+=1
return x, s[i:], None def leadingFraction(self, s):
x, scale, rem = int(0), float(1), ""
i, overflow = 0, False
while i < len(s):
c = s[i]
if c < '0' or c > '9':
break
if overflow:
continue
if x > (1<<63-1)/10 :
overflow = True
continue
y = x*10 + int(c) - int('0')
if y < 0:
overflow = True
continue
x = y
scale *= 10
i += 1
return x, scale, s[i:] """
将小时,分钟,转换为秒
比如: 5m 转换为 300秒;5m20s 转换为320秒
time 单位支持:"ns", "us" (or "µs"), "ms", "s", "m", "h"
"""
def ParseDuration(self, s):
if s == "" or len(s) < 1:
return 0 orig = s
neg = False
d = float(0) if s != "":
if s[0] == "-" or s[0] == "+":
neg = s[0] == "-"
s = s[1:] if s == "0" or s == "":
return 0 while s != "":
v, f, scale = int(0), int(0), float(1) print "S: %s" %s
# the next character must be [0-9.]
if not (s[0] == "." or '0' <= s[0] and s[0] <= '9'):
self.logger.error("time1: invalid duration %s, s:%s" % (orig, s))
return 0 # Consume [0-9]*
pl = len(s)
v, s, err = self.leadingInt(s)
if err != None:
self.logger.error("time2, invalid duration %s" %orig)
return 0
pre = pl != len(s) # consume (\.[0-9]*)?
post = False
if s != "" and s[0] == ".":
s = s[1:]
pl = len(s)
f, scale, s = self.leadingFraction(s)
post = pl != len(s)
if not pre and not post:
self.logger.error("time3, invalid duration %s" %orig)
return 0 # Consume unit.
i = 0
while i < len(s):
c = s[i]
if c == '.' or '0' <= c and c <= '9':
break
i+=1
if i == 0:
self.logger.error("time4: unkonw unit in duration: %s" %orig)
return 0
print "s:%s, i:%s, s[:i]:%s" %(s, i, s[:i])
u = s[:i]
s = s[i:]
if not self.unitMap.has_key(u):
self.logger.error("time5: unknow unit %s in duration %s" %(u, orig))
return 0
unit = self.unitMap[u]
if v > (1<<63-1)/unit:
self.logger.error("time6: invalid duration %s" %orig)
return 0
v *= unit
if f > 0 :
v += int(float(f) * (float(unit) / scale))
if v < 0:
self.logger.error("time7: invalid duration %s" %orig)
return 0
d += v
if d < 0 :
self.logger.error("time8: invalid duration %s" %orig)
return 0 if neg :
d = -d
return float(d)

 

使用实例:

#-*- coding:utf-8 -*-
from timeTools import TimeTool if __name__ == "__main__":
tools = TimeTool()
s = tools.ParseDuration("1m20.123s")
print s

默认打印单位是“Nanosecond”,如果想要打印单位为“second”的话,只需要将parse结果除以`TimeTool.Second`即可,例如:

```python

tools = TimeTool()
s = tools.ParseDuration("1m20.123s")
print s/tools.Second

```

Python实现ParseDuration-支持解析字符串格式的时间单位,例如将小时或者分钟数转换为秒的更多相关文章

  1. Python_time库_特定字符串格式的时间、struct_time、时间戳的处理

    time库 时间戳:格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数. # time.strptime(),功能:将特定字符串格 ...

  2. js把字符串格式的时间转换成几秒前、几分钟前、几小时前、几天前等格式

    最近在做项目的时候,需要把后台返回的时间转换成几秒前.几分钟前.几小时前.几天前等的格式:后台返回的时间格式为:2015-07-30 09:36:10,需要根据当前的时间与返回的时间进行对比,最后显示 ...

  3. 机器学习实战ch04 关于python版本所支持的文本格式问题

    函数定义中: def spamTest(): docList=[]; classList = []; fullText =[] for i in range(1,26):# print('cycle ...

  4. 让IIS支持解析.json格式文件

    原文出处链接及本声明. 原文链接:https://blog.csdn.net/jumtre/article/details/72630730 1.IIS内点击网站进入网站主页设置界面: 2.双击MIM ...

  5. 判断库中为字符串格式的时间是否为最近三个月(Java)

    今天分享一个问题,就是标题中提到的问题,今天在调用一个接口的时候,发现调用到的数据的时间格式为字符串类型,我有点蒙圈,于是,我就百度解决了这个问题,同时在这里记录一下,为了之后不再蒙圈::: 首先需要 ...

  6. js 字符串格式化为时间格式

    首先介绍一下我遇到的坑,找了几个关于字符串转时间的,他们都可以就我用的时候不行. 我的原因,我的字符串是MYSQL拿出来的不是标准的时间格式,是不会转成功的. 解决思路:先将字符串转为标准时间格式的字 ...

  7. js获取此刻时间或者把日期格式时间转换成字符串格式的时间

    getTime(val){ if (val&val instanceof Date){ d = val; }else{ d = new Date(); }; var year = d.getF ...

  8. python教程(六)·字符串

    我们已经学习了字符串的使用方法,我们还学习了使用索引和分片操作字符串,经历了这么长的时间,相信大家也有所掌握:本节将讨论并学习字符串的格式化与字符串的常用方法 字符串格式化 字符串是序列的一种,所以所 ...

  9. Python中的文档字符串作用

    文档字符串是使用一对三个单引号 ''' 或者一对三个双引号 """来包围且没有赋值给变量的一段文字说明(如果是单行且本身不含引号,也可以是单引号和双引号), 它在代码执行 ...

随机推荐

  1. Java基础(四) StringBuffer、StringBuilder原理浅析

    StringBuilder与StringBuffer作用就是用来处理字符串,但String类本身也具备很多方法可以用来处理字符串,那么为什么还要引入这两个类呢? 关于String的讲解请看Java基础 ...

  2. JS数据结构第三篇---双向链表和循环链表之约瑟夫问题

    一.双向链表 在上文<JS数据结构第二篇---链表>中描述的是单向链表.单向链表是指每个节点都存有指向下一个节点的地址,双向链表则是在单向链表的基础上,给每个节点增加一个指向上一个节点的地 ...

  3. 使用spring容器干掉if-else

    spring容器干掉if-else 场景说明 最近新做一个项目,需要对不同店铺的商品做不同处理.例如storeA需要进行handleA操作,storeB需要进行handleB操作,如此类推 大家很容易 ...

  4. Java 诞生的趣事

    ​ Java 命名的由来 Java是印度尼西亚爪哇岛的英文名称,因盛产咖啡而闻名.Java语言中的许多库类名称,多与咖啡有关:如JavaBeans(咖啡豆).NetBeans(网络豆)以及Object ...

  5. MySQL批量更新一个字段的值为随机数

    $arr = []; $str = ''; for ($i=0; $i < 2660; ++$i) { $str .= " WHEN ".$i." THEN &qu ...

  6. sentinel 滑动窗口统计机制

    sentinel的滑动窗口统计机制就是根据当前时间,获取对应的时间窗口,并更新该时间窗口中的各项统计指标(pass/block/rt等),这些指标被用来进行后续判断,比如限流.降级等:随着时间的推移, ...

  7. [python] 安装TensorFlow问题 解决Cannot uninstall 'wrapt'. It is a distutils installed project

    cmd安装 pip install tensorflow 1.遇到了 ERROR: Cannot uninstall 'wrapt'. It is a distutils installed proj ...

  8. WebGL 着色器偏导数dFdx和dFdy介绍

    本文适合对webgl.计算机图形学.前端可视化感兴趣的读者. 偏导数函数(HLSL中的ddx和ddy,GLSL中的dFdx和dFdy)是片元着色器中的一个用于计算任何变量基于屏幕空间坐标的变化率的指令 ...

  9. Ruby系列文章

    安装Ruby.多版本Ruby共存.Ruby安装慢问题 Ruby语言的一些杂项 Ruby中的常量:引号.%符号和heredoc Ruby中的数值 Ruby字符串(1):String基本用法 Ruby字符 ...

  10. C# 死锁 Task/AutoResetEvent

    与之前<C# 死锁 TaskCompletionSource>类似,还有很多死锁的案例 使用Task异步转同步时,使用不当造成的死锁 private void Task_OnClick(o ...