来自:“1 小时前”,至:timedelta +准确性

发布于 2024-10-15 02:20:55 字数 371 浏览 3 评论 0原文

有没有‘逆转人性化’时代的功能?

例如,给定(字符串):

  • “1 分钟前”
  • “7 小时前”
  • “5 天前”
  • “2 个月前”

可以返回(对伪代码表示歉意):

  • datetime.now() - timedelta(1 分钟) ,精度(60 秒)
  • datetime.now() - timedelta(7 小时),精度(1 小时)
  • datetime.now() - timedelta(5 天),精度(1 天)
  • datetime.now() - timedelta(2 个月) )、准确度(1个月)

Is there a function to 'reverse humanize' times?

For example, given (strings):

  • '1 minute ago'
  • '7 hours ago'
  • '5 days ago'
  • '2 months ago'

Could return (apologies for the pseudo-code):

  • datetime.now() - timedelta (1 minute), accuracy (60 seconds)
  • datetime.now() - timedelta (7 hours), accuracy (1 hour)
  • datetime.now() - timedelta (5 days), accuracy (1 day)
  • datetime.now() - timedelta (2 months), accuracy (1 month)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

巴黎夜雨 2024-10-22 02:20:55

我一直在使用 parsedatetime,它对我来说效果很好。主页列出了它可以处理的一些格式,例如:

  • 5 分钟后
  • 5 分钟后
  • 中午前 2 小时
  • 明天后 2 天

我发现的主要缺点是它没有时区意识。

如果它有价值,这里是我使用的包装函数,它总是返回一个 datetime 对象,无论输入字符串是相对的(就像所有示例一样)还是固定的:

def parse_datetime(datetime_string):
    datetime_parser = parsedatetime.Calendar(parsedatetime_consts.Constants())
    timestamp = datetime_parser.parse(datetime_string)
    if len(timestamp) == 2:
        if timestamp[1] == 0:
            raise ValueError(u'Failed to parse datetime: %s' % datetime_string)
        timestamp = timestamp[0]
    return datetime.fromtimestamp(time.mktime(timestamp))

I've been using parsedatetime and it's worked rather well for me. The home page lists some formats it can handle, e.g.:

  • in 5 minutes
  • 5 minutes from now
  • 2 hours before noon
  • 2 days from tomorrow

The major downside I've found is that it has no sense of timezones.

In case it's worth anything, here's a wrapper function I use, which always returns a datetime object regardless of whether the input string is relative (like all your examples) or fixed:

def parse_datetime(datetime_string):
    datetime_parser = parsedatetime.Calendar(parsedatetime_consts.Constants())
    timestamp = datetime_parser.parse(datetime_string)
    if len(timestamp) == 2:
        if timestamp[1] == 0:
            raise ValueError(u'Failed to parse datetime: %s' % datetime_string)
        timestamp = timestamp[0]
    return datetime.fromtimestamp(time.mktime(timestamp))
谁人与我共长歌 2024-10-22 02:20:55

您能不能自己编写一个简单的实现,例如:

import datetime

def parsedatetime(str_val):

  parts = str_val.split(' ')

  if len(parts) != 3 and parts[2] != 'ago':
     raise Exception("can't parse %s" % str_val)

  try:
     interval = int(parts[0])
  except ValueError,e :
     raise Exception("can't parse %s" % str_val)

  desc = parts[1]

  if 'second' in desc:
     td = datetime.timedelta(seconds=interval)
  elif 'minute' in desc:
     td = datetime.timedelta(minutes=interval)
  elif 'hour' in desc:
     td = datetime.timedelta(minutes=interval*60)
  elif 'day' in desc:
     td = datetime.timedelta(days=interval)
  else:
     raise Exception("cant parse %s" % str_val)

   answer = datetime.datetime.now - td
   return answer

输入看起来没有变化。

Can you not just write a simple implementation yourself such as:

import datetime

def parsedatetime(str_val):

  parts = str_val.split(' ')

  if len(parts) != 3 and parts[2] != 'ago':
     raise Exception("can't parse %s" % str_val)

  try:
     interval = int(parts[0])
  except ValueError,e :
     raise Exception("can't parse %s" % str_val)

  desc = parts[1]

  if 'second' in desc:
     td = datetime.timedelta(seconds=interval)
  elif 'minute' in desc:
     td = datetime.timedelta(minutes=interval)
  elif 'hour' in desc:
     td = datetime.timedelta(minutes=interval*60)
  elif 'day' in desc:
     td = datetime.timedelta(days=interval)
  else:
     raise Exception("cant parse %s" % str_val)

   answer = datetime.datetime.now - td
   return answer

The input doesn't look that varied.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文