Python实现ParseDuration-支持解析字符串格式的时间单位,例如将小时或者分钟数转换为秒
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-支持解析字符串格式的时间单位,例如将小时或者分钟数转换为秒的更多相关文章
- Python_time库_特定字符串格式的时间、struct_time、时间戳的处理
time库 时间戳:格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数. # time.strptime(),功能:将特定字符串格 ...
- js把字符串格式的时间转换成几秒前、几分钟前、几小时前、几天前等格式
最近在做项目的时候,需要把后台返回的时间转换成几秒前.几分钟前.几小时前.几天前等的格式:后台返回的时间格式为:2015-07-30 09:36:10,需要根据当前的时间与返回的时间进行对比,最后显示 ...
- 机器学习实战ch04 关于python版本所支持的文本格式问题
函数定义中: def spamTest(): docList=[]; classList = []; fullText =[] for i in range(1,26):# print('cycle ...
- 让IIS支持解析.json格式文件
原文出处链接及本声明. 原文链接:https://blog.csdn.net/jumtre/article/details/72630730 1.IIS内点击网站进入网站主页设置界面: 2.双击MIM ...
- 判断库中为字符串格式的时间是否为最近三个月(Java)
今天分享一个问题,就是标题中提到的问题,今天在调用一个接口的时候,发现调用到的数据的时间格式为字符串类型,我有点蒙圈,于是,我就百度解决了这个问题,同时在这里记录一下,为了之后不再蒙圈::: 首先需要 ...
- js 字符串格式化为时间格式
首先介绍一下我遇到的坑,找了几个关于字符串转时间的,他们都可以就我用的时候不行. 我的原因,我的字符串是MYSQL拿出来的不是标准的时间格式,是不会转成功的. 解决思路:先将字符串转为标准时间格式的字 ...
- js获取此刻时间或者把日期格式时间转换成字符串格式的时间
getTime(val){ if (val&val instanceof Date){ d = val; }else{ d = new Date(); }; var year = d.getF ...
- python教程(六)·字符串
我们已经学习了字符串的使用方法,我们还学习了使用索引和分片操作字符串,经历了这么长的时间,相信大家也有所掌握:本节将讨论并学习字符串的格式化与字符串的常用方法 字符串格式化 字符串是序列的一种,所以所 ...
- Python中的文档字符串作用
文档字符串是使用一对三个单引号 ''' 或者一对三个双引号 """来包围且没有赋值给变量的一段文字说明(如果是单行且本身不含引号,也可以是单引号和双引号), 它在代码执行 ...
随机推荐
- Impala概念与架构
Impala概念与架构 下面的内容介绍Cloudera Impala的背景资料及特性,以便你更高效的使用它.Where appropriate, the explanations include co ...
- PHP实现图片(文件)上传
这几天整理做过的php项目,感觉这个经常会用到,传上来共享一下咯 首先,前端界面 1.表单的首行需要加上enctype="multipart/form-data",需要上传的图片必 ...
- gitlab安装笔记二_Centos7配置163yum源
进入配置目录 cd /etc/yum.repos.d 压缩备份原有的配置 sudo tar cvf base.tar.gz *.repo 可以解压查看备份 sudo tar xvf base. ...
- Laravel --- Laravel5.3 和 Workerman结合使用(异步)
网上查阅资料有现成和workerman结合的composer组件,但个人感觉不太靠谱,github上star太少,而且怕有问题也不好调,就想自己先试试. 我的办法因为修改要一点Workerman源码, ...
- Spark学习之路(八)—— Spark SQL 之 DataFrame和Dataset
一.Spark SQL简介 Spark SQL是Spark中的一个子模块,主要用于操作结构化数据.它具有以下特点: 能够将SQL查询与Spark程序无缝混合,允许您使用SQL或DataFrame AP ...
- 【设计模式】行为型09访问者模式(Visitor Pattern)
学习地址:https://blog.csdn.net/u012124438/article/details/70537203(参考了很多博客,只有这个讲明白了核心点) 访问者模式(Visitor P ...
- 浅入深出Vue:组件
组件在 vue开发中是必不可少的一环,用好组件这把屠龙刀,就能解决不少问题. 组件是什么 官方的定义: 组件是可复用的 Vue 实例,并且可带有一个名字. 官方的定义已经非常简明了,组件就是一个实例. ...
- C++屌屌的观察者模式-同步回调和异步回调
目录 一.概述 1.同步观察者 2.异步观察者 二.效果展示 三.同步观察者 四.异步观察者 五.相关文章 原文链接:C++屌屌的观察者模式-同步回调和异步回调 一.概述 说起观察者模式,也是比较简单 ...
- Jenkins+GitLab+Docker+SpringCloud+Kubernetes实现可持续自动化微服务
现有混合云平台的场景下,即有线下和线上的环境,又有测试与正式的场景,而且结合了Docker,导致打包内容有所区分,且服务的发布流程复杂起来,手工打包需要在编译阶段就要根据环境到处更改配置,因此纯手工发 ...
- 【名额有限】云开发AI拓展能力等你来体验!
这次来了个超厉害的新能力! 人脸智能打马赛克.人脸智能裁剪--各种操作,都能一步到位! 迫不及待想体验,戳链接:https://wj.qq.com/s2/3986990/e0ef/ 还没有搞懂,继续往 ...