爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 5100|回复: 0

[分享资料] 预报时效计算

[复制链接]

新浪微博达人勋

发表于 2022-7-25 18:15:48 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
被封在家,无聊摆弄GrADS,出图的时候想不起来怎么查询当前时间并将其设置为标题,于是搞出了这个计算预报时间的东西。


  1. * 是否闰年。是的话返回1,不是的话返回0;然后在计算2月的日数的时候直接加就好
  2. function isLeapYear(y)
  3.     if ( math_mod(y, 4) != 0)
  4.         return 0
  5.     else
  6.         if (math_mod(y, 100) = 0)
  7.             return 0
  8.         else
  9.             if (math_mod(y, 400) = 0)
  10.                 return 1
  11.             endif
  12.         endif
  13.         return 1
  14.     endif

  15. * 计算本月多少天。y为年份,m为月份
  16. function getMonthDays(y, m)
  17.     i = 1
  18.     while (i<=12)
  19.         mon.i = 31
  20.         i = i + 1
  21.     endwhile
  22.     mon.2 = 28 + isLeapYear(y)
  23.     mon.4 = 30
  24.     mon.6 = 30
  25.     mon.9 = 30
  26.     mon.11 = 30
  27.     m = m + 0
  28.     return mon.m

  29. * 计算时间。sdate为起报时间YYYYMMDDHH;period为预报时效,单位为小时
  30. function calcDate(sdate, period)
  31.     y = substr(sdate, 1, 4)
  32.     m = substr(sdate, 5, 2)
  33.     d = substr(sdate, 7, 2)
  34.     h = substr(sdate, 9, 2)
  35.     y = y + 0
  36.     m = m + 0
  37.     d = d + 0
  38.     h = h + period
  39.     while (h>=24)
  40.         h = h - 24
  41.         d = d + 1
  42.         if (d > getMonthDays(y,m))
  43.             d = 1
  44.             m = m + 1
  45.             if (m>12)
  46.                 m = 1
  47.                 y = y + 1
  48.             endif
  49.         endif
  50.     endwhile
  51.    
  52.     ret = y
  53.     if (m<10)
  54.         ret = ret % '0' % m
  55.     else
  56.         ret = ret %  m
  57.     endif
  58.     if (d<10)
  59.         ret = ret % '0' % d
  60.     else
  61.         ret = ret %  d
  62.     endif
  63.     if (h<10)
  64.         ret = ret % '0' % h
  65.     else
  66.         ret = ret %  h
  67.     endif
  68.     return ret
复制代码
测试内容如下
  1. say calcDate('2020072412', 2)
  2. say calcDate('2020073112', 24)
  3. say calcDate('2020022812', 24)
  4. say calcDate('2020022812', 48)
  5. say calcDate('2020022812', 72)
  6. say calcDate('2021022812', 24)
  7. say calcDate('2021022812', 48)
  8. say calcDate('2021022812', 72)
复制代码
测试结果为
  1. 2020072414
  2. 2020080112
  3. 2020022912
  4. 2020030112
  5. 2020030212
  6. 2021030112
  7. 2021030212
  8. 2021030312
复制代码
(目前看着暂时没发现问题……如果用着的时候发现问题再说)
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表