iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >怎么用Shell脚本实现的阳历转农历
  • 537
分享到

怎么用Shell脚本实现的阳历转农历

2023-06-09 18:06:02 537人浏览 独家记忆
摘要

本篇内容介绍了“怎么用shell脚本实现的阳历转农历”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、缘由本脚本实现原理是查表法(因为公式有

本篇内容介绍了“怎么用shell脚本实现的阳历转农历”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

1、缘由

本脚本实现原理是查表法(因为公式有误差);基于农历新年为基准,对农历新年前后两个不同的农历进行计算。

写这个脚本之前是想在linux 终端命令提示符中加入阳历及农历日期。在ubuntu中有Lunar软件可以获取农历日期,但在Fedora或Centos中并没有类似软件,所以就想自己来实现一个,但网上用其他语言写的一大把,如果再写没什么必要。所以就想用shell来写一个。

2、功能及使用

功能:将具体的阳历日期转换为农历日期。

时间范围:1901~2099,对应农历年时间为4598~4796

参数格式(无参数默认为当前系统日期):yyyymmdd

如2013年1月1日:

代码如下:


$./lunar.sh 20130101
4709-11-20

3、完整数据

完整数据下载链接:
Http://xiazai.jb51.net/201408/tools/lunar-20131202.7z

包中文件:

lunar.sh 主脚本,具体实现

datebases 农历元数据

change.log 更改日志

readme 脚本说明及注意事项

主要脚本lunar.sh代码如下:

#!/bin/shDATE=$@[ "$DATE" = "" ] && DATE=$(date +%Y%m%d)databases_path=databasesdate_year=$(echo $DATE |sed 's/^\(.\{4\}\).*/\1/')date_month=$(echo $DATE |sed 's/.*\(..\)..$/\1/')date_day=$(echo $DATE |sed 's/.*\(..\)$/\1/')date_days=$(date -d $DATE +%j)lunar_year=$(sed /$date_year/!d $databases_path |sed 's/^\(....\).*/\1/')lunar_year_data=$(sed /$date_year/!d $databases_path |sed 's/.*\ \(.*\)/\1/')lunar_year_data_bin=$(echo "ibase=16;obase=2;$lunar_year_data"|bc |sed -e :a -e 's/^.\{1,23\}$/0&/;ta')new_year_month_bin=$(echo $lunar_year_data_bin |sed -e 's/^.\{17\}\(.\{2\}\).*/\1/')new_year_month=$(echo "ibase=2;$new_year_month_bin"|bc |sed -e :a -e 's/^.\{1,1\}$/0&/;ta')new_year_day_bin=$(echo $lunar_year_data_bin |sed -e 's/.*\(.\{5\}\)$/\1/')new_year_day=$(echo "ibase=2;$new_year_day_bin"|bc |sed -e :a -e 's/^.\{1,1\}$/0&/;ta')new_year_days=$(date -d $date_year$new_year_month$new_year_day +%j)lunar_days=$(expr $date_days - $new_year_days + 1)befor_or_after=0if [ "$lunar_days" -le "0" ]; then  befor_or_after=1  date_year=$(($date_year - 1))  lunar_year=$(sed /$date_year/!d $databases_path |sed 's/^\(....\).*/\1/')  lunar_year_data=$(sed /$date_year/!d $databases_path |sed 's/.*\ \(.*\)/\1/')  lunar_year_data_bin=$(echo "ibase=16;obase=2;$lunar_year_data"|bc |sed -e :a -e 's/^.\{1,23\}$/0&/;ta')filunar_leap_month_bin=$(echo $lunar_year_data_bin |sed -e 's/^\(.\{4\}\).*/\1/')lunar_leap_month=$(echo "ibase=2;$lunar_leap_month_bin"|bc)lunar_month_all_bin=$(echo $lunar_year_data_bin |sed -e 's/^.\{4\}\(.\{13\}\).*/\1/')[ "$lunar_leap_month" = "0" ] && lunar_month_all_bin=$(echo $lunar_year_data_bin |sed -e 's/^.\{4\}\(.\{12\}\).*/\1/')lunar_month_all=$(echo $lunar_month_all_bin |sed -e 's/0/29\ /g' |sed -e 's/1/30\ /g')if [ "$befor_or_after" = "0" ];then  lunar_month=1  lunar_day=$lunar_days  for i in $lunar_month_all  do   [ "$lunar_day" -gt "$i" ] && lunar_day=$(($lunar_day - $i)) && lunar_month=$(($lunar_month + 1))   [ "$lunar_day" = "$i" ] && break  doneelse  lunar_month=12  lunar_day=$((-$lunar_days))  lunar_month_all_bin=$(echo $lunar_month_all_bin |rev)  lunar_month_all=$(echo $lunar_month_all_bin |sed -e 's/0/29\ /g' |sed -e 's/1/30\ /g')  for i in $lunar_month_all  do   if [ "$lunar_day" -gt "$i" ]; then     lunar_day=$(($lunar_day - $i))     lunar_month=$(($lunar_month - 1))   else     lunar_day=$(($i - $lunar_day))     break   fi  donefiif [ "$lunar_leap_month" = "0" ]; then  echo $lunar_year-$lunar_month-$lunar_dayelse  if [ "$lunar_leap_month" -ge "$lunar_month" ]; then   echo $lunar_year-$lunar_month-$lunar_day  elif [ "$befor_or_after" = "0" ]; then   if [ "$(($lunar_leap_month + 1))" = "$lunar_month" ];then     lunar_month=$(($lunar_month - 1))     echo $lunar_year-*$lunar_month-$lunar_day   else     lunar_month=$(($lunar_month - 1))     echo $lunar_year-$lunar_month-$lunar_day   fi  else   echo $lunar_year-$lunar_month-$lunar_day  fifilunar.sh

4 修改历史

2013-12-02

发现bug:如果农历上个月是大月,本月为小月,则上个月的三十输出为本月的初一,原因是上个月剩下30天,这正好是上个月的三十,而本月是29天,29<30,下一次循环的时候又减本月的天数,使得上个月的三十成为本月的初一

bug修改:添加判断语句,如果农历剩余天数等于当月的天数则不再循环

“怎么用Shell脚本实现的阳历转农历”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: 怎么用Shell脚本实现的阳历转农历

本文链接: https://www.lsjlt.com/news/257365.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么用Shell脚本实现的阳历转农历
    本篇内容介绍了“怎么用Shell脚本实现的阳历转农历”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、缘由本脚本实现原理是查表法(因为公式有...
    99+
    2023-06-09
  • php实现农历公历日期的相互转换
    农历(Lunar calendar)和公历(Gregorian calendar)是两种不同的日历系统。公历是基于太阳和地球的运动来计算时间的,而农历是基于月亮的运动来计算时间的。 农历中的月份是根据月亮的相对位置来确定的,而公历中的月份...
    99+
    2023-08-31
    php 开发语言 Powered by 金山文档
  • shell脚本如何实现日历的屏幕控制
    这篇文章主要介绍shell脚本如何实现日历的屏幕控制,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!首先什么是脚本 脚本语句由Linux系统解释执行.脚本由脚本语言与可执行的二进制文件或命令组成,因此,脚本是不需要再编...
    99+
    2023-06-09
  • 如何实现Shell脚本遍历一个日期范围
    本篇内容主要讲解“如何实现Shell脚本遍历一个日期范围”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何实现Shell脚本遍历一个日期范围”吧!代码如下:#!/usr/bin/env bash...
    99+
    2023-06-09
  • 怎么在Shell脚本中使用for循环遍历参数
    这篇文章将为大家详细讲解有关怎么在Shell脚本中使用for循环遍历参数,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1.当一个脚本需要传入的参数较多时,可以使用for循环进行参数遍历示例:...
    99+
    2023-06-09
  • 怎么用shell写递归遍历目录及子目录的脚本
    这篇文章主要讲解了“怎么用shell写递归遍历目录及子目录的脚本”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用shell写递归遍历目录及子目录的脚本”吧!用shell写的递归遍历目录的...
    99+
    2023-06-09
  • 使用shell脚本怎么遍历文件夹内所有的文件
    这期内容当中小编将会给大家带来有关使用shell脚本怎么遍历文件夹内所有的文件,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1.这里写一个函数,实现对文件夹内所有文件名的读取,采用的方法是递归!#!/bi...
    99+
    2023-06-09
  • 怎么用Shell脚本遍历目录并批量修改文件
    本篇内容主要讲解“怎么用Shell脚本遍历目录并批量修改文件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用Shell脚本遍历目录并批量修改文件”吧!在将windows上的jsp网页移植到l...
    99+
    2023-06-09
  • Shell脚本之进制转换器的实现
    目录一、需求说明二、脚本内容三、使用示例一、需求说明 计算IP地址我们经常需要将十进制和二进制数值之间进行转换,实际上进制之间转换通过bc命令就可以完成。此进制转换器shell脚本就是利用bc进制转换功能来实现我们的需求...
    99+
    2023-03-23
    Shell 进制转换器 Shell 进制转换
  • 怎么用shell脚本实现ssh登录
    要使用shell脚本实现SSH登录,你可以使用SSH命令行工具,并将其包含在shell脚本中。以下是一个简单的示例:```bash#...
    99+
    2023-10-12
    shell ssh
  • 怎么用Python实现一本个性化日历
    今天小编给大家分享一下怎么用Python实现一本个性化日历的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、准备开始之前,你...
    99+
    2023-06-29
  • 怎么用SQL生成一张带农历的日期维度表
    本篇内容介绍了“怎么用SQL生成一张带农历的日期维度表”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!创建农...
    99+
    2024-04-02
  • 怎么使用shell脚本实现ssh登录
    使用shell脚本实现SSH登录可以通过以下步骤实现:1. 创建一个新的shell脚本文件,比如`login.sh`。2. 在脚本文...
    99+
    2023-09-22
    shell ssh
  • 怎么使用Shell脚本实现进度条
    这篇文章主要介绍“怎么使用Shell脚本实现进度条”,在日常操作中,相信很多人在怎么使用Shell脚本实现进度条问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用Shell脚本实现进度条”的疑惑有所帮助!...
    99+
    2023-07-05
  • 怎么使用shell脚本实现ssh互信
    要使用shell脚本实现ssh互信,你可以按照以下步骤操作:1. 创建一个名为`setup_ssh.sh`的shell脚本文件。2....
    99+
    2023-09-22
    shell ssh
  • 使用Shell怎么对包含空格的文本进行遍历
    这期内容当中小编将会给大家带来有关使用Shell怎么对包含空格的文本进行遍历,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。shell遍历文件有时候要对某个文件夹下面的所有文件做同样的处理,比如对每个文件统...
    99+
    2023-06-14
  • Shell脚本中怎么实现随机数
    Shell脚本中怎么实现随机数,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、通过时间获得随机数(date)这个也是我们经常用到的,可以说时间是唯一的,也不会重复的,从这个里...
    99+
    2023-06-09
  • shell脚本怎么实现猜数游戏
    这篇文章主要介绍shell脚本怎么实现猜数游戏,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!用shell脚本写一个猜数游戏最近用shell写的一个猜数游戏,包括4个不同难度,脚本如下:#作者:p_小王echo&nbs...
    99+
    2023-06-09
  • Oracle DBA常用脚本中转换执行shell脚本是怎样的
    今天就跟大家聊聊有关Oracle DBA常用脚本中转换执行shell脚本是怎样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。最近在开始把Oracl...
    99+
    2024-04-02
  • 怎么用shell脚本实现LINUX下的流量监控
    本篇内容主要讲解“怎么用shell脚本实现LINUX下的流量监控”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用shell脚本实现LINUX下的流量监控”吧!一、脚本源码# vi /etc/...
    99+
    2023-06-09
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作