如何使用bash将YYYYMMDD转换为MJD格式

时间:2016-09-21 18:25:12

标签: bash shell unix sh

如何转换javascript等效算法将YYYYMMDD转换为MJD修改julan天到bash脚本这里是javascript代码

function YMDtoMJD (year, month, day)
{    

var year;
var monthi
var day;
var yr  = Math.floor (year); 
var mn  = Math.floor (month);
var day = Math.floor (day);          
var hr  = 0.0;                    // Hours are not valid
var L;
var julian;    
var mjd;


// In leap years, -1 for Jan, Feb, else 0
L = Math.ceil ((mn - 14) / 12);

var p1 = day - 32075 + Math.floor (1461 * (yr + 4800 + L) / 4);    
var p2 = Math.floor (367 * (mn - 2 - L * 12) / 12);
var p3 = 3 * Math.floor (Math.floor ((yr + 4900 + L) / 100) / 4);
julian = p1 + p2 - p3;        
julian = julian + (hr / 24.0) - 0.5;

mjd = julian - 2400000.5; 
return (mjd);
}

我尝试使用bash脚本,但卡在中间

#!/bin/bash
#clear

mn=12
Yr=2014
Dd=23

L=`ceil $((($mn-14)/12))`

p1=$(($Dd-32075+`floor $(((1461*(($Yr+4800+$L)/4))))`))

请帮我转换为bash 下面是我正在使用的楼层和ceil功能

   floor_val=
    function floor() {
      float_in=$1
      floor_val=${float_in/.*}
   }
  float_val=$1
floor $float_val
echo $floor_val

ceil_val=
function ceiling() {
float_in=$1
ceil_val=${float_in/.*}
ceil_val=$((ceil_val+1))
}

float_val=$1
ceiling $float_val
echo $ceil_val

3 个答案:

答案 0 :(得分:0)

对于ceil(a,b)函数,您可以使用公式 ceil = 1 + floor((a-1)/ b)

function ceil() { echo $((1+(($1-1)/$2))); }

如果你有 bc ,你也可以使用它。

答案 1 :(得分:0)

我认为实现任务的最简单方法是使用date命令,而不是自己做数学。您可以通过--date选项指定要显示的日期和时间(而不是默认使用的当前日期和时间)。幸运的是,date足够智能,可以默认正确识别几种格式(包括你拥有的格式)。然后使用+FORMAT语法指定希望输出日期和时间的格式。

例如:

$ date --date='20160921' +'%m%y%d'
091621

有关可用格式的详细信息,请查看the man pageGNU Coreutils manual的相关部分。

不幸的是,这仅适用于date的GNU版本。 POSIX standard未指定--date选项。

答案 2 :(得分:0)

我使用这个:

DAY="20200101"
MJD=$(( ( $(date +%s -d "$DAY") / 86400 ) + 40588 ))
#echo $MJD
58849
相关问题