使用 Ubuntu 做自己的办公环境用了将近三年,最近换了新款的 MBP,系统都用的很舒服。

不过 Ubuntu 是在我的 TP W540上部署的,而 W540 + 电源适配太重了(我的电池是9芯的)

用了 mac 多少会吧 Ubuntu 上的一些使用习惯带过来。

其中一个习惯就是,Ubuntu 右上角点时间会出现日历(一个月有那些天的日历),而 mac 的没有,然后就想mac 上应该有自定义实现的方法。

去搜了一些,找到了 GeekTool这个工具,真的很棒,桌面能做多漂亮全看你想象力有多丰富。

我这里主要想实现一个自定义日历,需要用到 shell。

下载地址:https://www.tynsoe.org/v2/geektool/

文档的话,需要大家自己去看英文文档,使用难度:简单。

我想要在桌面显示 上一个月、当前月、下一个月 三个月的日历,并且当前月的当前天 要高亮显示。

需求很简单,做起来有些麻烦,问题主要是OSX 里的命令和 Ubuntu 里的 cal 命令不同。

OSX 里的cal 没有这个功能,既然没有,那就自己写一个吧,python 是一门强大的语言,我选择了用 python 来实现这个功能。

代码如下:

#!/usr/bin/env python
import calendar
import datetime
import re def get_year_month(d):
"""
:param datetime_obj: a datetime object ; for example : datetime.datetime.now()
:return: a datetime object
"""
return d.year, d.month def get_pre_datetime(datetime_obj):
"""
:param datetime_obj: a datetime object ; for example : datetime.datetime.now()
:return: a datetime object
"""
days_count = datetime.timedelta(days=datetime_obj.day)
pre_month_last_day_datetime_obj = datetime_obj - days_count
return pre_month_last_day_datetime_obj def get_next_datetime(datetime_obj):
"""
:param datetime_obj: a datetime object ; for example : datetime.datetime.now()
:return: a datetime object
"""
days_count = calendar.monthrange(datetime_obj.year, datetime_obj.month)[1]
next_month_datetime = datetime_obj + datetime.timedelta(days=days_count+1) - datetime.timedelta(datetime.datetime.now().day)
return next_month_datetime def day_format(datetime_obj, cal_str):
"""
:param datetime_obj: a datetime object ; for example : datetime.datetime.now()
:param d: a datetime object ; for example : datetime.datetime.now()
:return: a datetime object
"""
day = datetime_obj.day
reg_num = "\D{}\D".format(day)
reg = re.search(reg_num, cal_str).group()
ret = re.sub('\d+', "\033[31m{}\033[0m".format(day), reg)
return re.sub(reg, ret, cal_str) if __name__ == '__main__':
currnet_time = datetime.datetime.now() pre_year_month = get_year_month(get_pre_datetime(currnet_time))
currnet_year_month = get_year_month(currnet_time)
next_year_month = get_year_month(get_next_datetime(currnet_time)) # with open('/var/tmp/cal.log', 'w') as f:
# f.write(calendar.month(*pre_year_month, w=3, l=1))
# f.write(day_format(currnet_time, calendar.month(*currnet_year_month, w=3, l=1)))
# f.write(calendar.month(*next_year_month, w=3, l=1)) print(calendar.month(*pre_year_month, w=3, l=1))
print(day_format(currnet_time, calendar.month(*currnet_year_month, w=3, l=2)))
print(calendar.month(*next_year_month, w=3, l=1))

完成后的效果图:

在使用的过程中,跨年也没有问题:

  

最新文章

  1. ASP.NET通过递归添加树(Treeview)
  2. git操作命令
  3. codevs 1201 最小数和最大数
  4. FSM, VISIBILITY MAP AND VACUUM
  5. Tomcat SSL 设置
  6. Delphi richedit获取选中文字
  7. MVC神韵---你想在哪解脱!(十一)
  8. 关于ProgressBar的美化问题
  9. 3TB硬盘的容量已经超出了传统分区标准的支持
  10. 有关java调用批处理文件
  11. Linux上 ps 命令的用法
  12. 新手自定义view练习实例之(二) 波浪view
  13. 关于在spring boot里使用Thymeleaf模板的application.properties配置
  14. CF1095E Almost Regular Bracket Sequence
  15. 漏洞复现——Apache HTTPD多后缀解析漏洞
  16. 微信开发-PC调试-JS-SDK功能之分享功能调试
  17. Linux 内存池【转】
  18. C# 查看所有的隐藏文件
  19. Spring Boot 运作原理
  20. 在IIS6上部署WebService

热门文章

  1. 在CentOS 7中安装Redis 3.2.8
  2. SDOI Day2
  3. IOS8 : UIAlertController
  4. jquery序列化form表单
  5. 深入浅出Redis-Spring整合Redis
  6. Java日常总结之LinkedList、ArrayList的效率分析
  7. MAVEN学习(初级)
  8. Gradle之恋-任务2
  9. iOS 常用公共方法
  10. 九度OJ题目1080:进制转换(java)使用BigInteger进行进制转换