如何在AwesomeWM文本时钟小部件中实现次序天数?

我正在使用编译于Lua 5.3.3的AwesomeWM v4.0-170-g6c24848-dirty,并且我开始自定义我的小部件。

其中之一是时钟,技术上是wibox.widget.textclock()。我已经能够改变format以改变顺序,添加自定义消息,例如“今天是2017年7月23日星期日”,但是…没有关于序数的线索。

我的意思是如何在“23rd”后面添加“rd”,并根据当前日期进行更改,例如“21st”,“22 nd”或“24 th”。

我尝试在格式之前添加一个ordinal变量,然后紧接着一个if-else语句以确定它的值取决于哪天。然而,这并不起作用:我既不能在函数外部“使用”日期格式,也不能在format中实现该变量。

就我所了解,字符串中的变量可以像以下示例一样进行实现:

print("Hello " .. name .. ", the value of key " .. k .. " is " .. v .. "!")

但是,这里不起作用。我已经没有线索了,你能帮我一下吗?

到目前为止,我已经编写了一个通用的“th”日期格式:

mytextclock = wibox.widget.textclock("%a %dth %B, %H:%M ", 60)

……其输出将是:weekoftheweek dayth month,HH,MM。

点赞
用户6212808
用户6212808

Background:

一开始,我在考虑两种解决方案:

1. 从整个输出字符串中选择日期:在程序处理之后,使用一种类似于 Bash echo $2 的 Lua 等价物来…

考虑到一种输出格式为 星期几 月 日 hh:mm 的输出:

**2. 直接处理变量 day**:这意味着要找到一种方法来获得该变量而不使用整个字符串,一旦我们有了它…

…稍后使用 if-else 结构进行处理,具体处理方式将根据其值而变化。

出于速度方面的考虑,我选择了第二种方式。与其花费一些代码行来从输出中提取变量,不如从开始就更容易、更干净地获得变量。

因此,我开始使用 %d 作为我的主要工作变量,它在 Lua 中用于表示日期中的一天。(出处

主要问题在于将 %d 的内容转换为字符串:

day = "%d" -- 这应该是一个整数。
daynumber = tostring(day) -- 将其转换为字符串。
lastdigit = tostring(day, -1)
print(lastdigit) -- 输出:d。

BOOM!失败了。希望有人能在评论中说出原因。如果我打印最后一个字符(-1),输出始终是 d,如果我尝试使用 -2,那么将会得到整个日期值。

我的主要理论基于这样一个事实:在 Lua 解释器中(在你的 shell 中使用 $ lua),打印出来的就只是 %d,根本没有整数;但这只是一个假设。更重要的是,就我所读到的,%d 在日期上下文中使用,而不是独立作为变量值。

一种可能的解决方案:

day = os.date("%d") -- 首先,我们从系统时间中获取了日期。

-- 由于 Lua 显示日期时有两个数字,我们将它们分别存储在变量中,以便稍后单独处理它们。
firstdigit = string.sub(day, 0, 1)
lastdigit = string.sub(day, -1)

-- 我们不想 Awesome 显示 '01st August' 或 '08th September'。我们将要抑制 '0'。
if firstdigit == "0" then
  day = lastdigit
end

-- 现在,我们要将日期与它的序数一起显示:1st、2nd、3rd、4th…我们将使用最后一位数字进行处理。
if lastdigit == "1" then
  ordinal = "st"
elseif lastdigit == "2" then
  ordinal = "nd"
elseif lastdigit == "3" then
  ordinal = "rd"
else
  ordinal = "th"
end

-- 最后,我们将显示最终日期。
mytextclock = wibox.widget.textclock(" %a " ..day..ordinal.. " %B %H:%M ", 60)

…然后我们会得到以下输出:

1st

2nd

3rd

5th

2017-07-23 22:39:58
用户10981240
用户10981240

我在我的 Conky 文件中加了以下内容:

${exec /home/..../scripts/date-ordinal.sh}

date-ordinal.sh 包含:

#!/bin/bash

the_Day=$(date +'%d')

case $the_Day in
    1,21,31)
        echo "st"
        ;;
    2,22)
        echo "nd"
        ;;
    3,23)
        echo "rd"
        ;;
    *)
        echo "th"
        ;;
esac
2019-01-28 20:48:51