【问题标题】:how to convert YYYYMMDD to MJD format using bash如何使用 bash 将 YYYYMMDD 转换为 MJD 格式
【发布时间】:2016-09-21 18:25:11
【问题描述】:

如何将 javascript 等效的算法转换为将 YYYYMMDD 转换为 MJD 修改的 julan day 到 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 下面是我正在使用的 floor 和 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

【问题讨论】:

  • bash 中没有floor 命令。
  • 但是你不需要它,因为bash 算术只是整数。分区总是返回地板。

标签: bash shell unix sh


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    我用这个:

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

    【讨论】:

    • testing... 发现偏移值为 40487。推理:您的日期可能是某个本地日期,因此具有与时区相关的偏移。相反,DAY="2020-01-01 UTC" 的值将导致与平台无关的结果。 date 命令将 /script-internally/ 返回 1577836800 的值(您甚至可以在线使用任何 epoch-decoder 进行检查,例如这个具有 24 小时输出的:unixtimestamp.com/index.php)。最后你会看到你的值 58849 - 当使用偏移量 40587 时。
    【解决方案3】:

    我认为完成任务的最简单方法是使用date 命令,而不是自己进行数学计算。您可以通过--date 选项指定您希望它显示的日期和时间(而不是默认使用的当前日期和时间)。幸运的是,date 足够聪明,默认情况下可以正确识别几种格式(包括您拥有的格式)。然后使用+FORMAT 语法指定您希望输出日期和时间的格式。

    例如:

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

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

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

    【讨论】:

    • MJD 格式不是月-年-日。它是天文学上使用的非 POSIX“纪元”值,以天为单位。您可以在网络上查找详细信息。
    猜你喜欢
    • 1970-01-01
    • 2019-03-22
    • 1970-01-01
    • 2010-11-15
    • 2014-07-03
    • 1970-01-01
    • 1970-01-01
    • 2021-01-16
    • 1970-01-01
    相关资源
    最近更新 更多