计算日期间隔,以XX年XX月XX日格式显示

一个报表中用户提出了这样的需求, 与其花时间找标准函数(还不知道有没有),不如干脆自己写一个,代码如下:

 &---------------------------------------------------------------------*
*&      Form  getdate
*&---------------------------------------------------------------------*
*  以当前日期为准,计算月间隔日期
*----------------------------------------------------------------------*
FORM culc_date USING  p_diff_m
                   CHANGING p_v_date.

  DATA:v_year_n(4TYPE n,
           v_year_c(4TYPE c,
           v_month_n(2TYPE n,
           v_month_c(2TYPE c,
           v_day_n(2TYPE n,
           v_day_c(2TYPE c,
           v_date_c(8TYPE c,
           v_mod1 TYPE i,
           v_mod2 TYPE i,
           v_mod3 TYPE i.

  v_month_c = sy-datum+4(2).
  v_month_n = v_month_c.

  v_year_c = sy-datum+0(4).
  v_year_n = v_year_c.

  v_day_c = sy-datum+6(2).

  v_month_n = v_month_n - p_diff_m.
  IF v_month_n <= 0.
    v_month_n = v_month_n + 12 + p_diff_m - 1.
    v_year_n = v_year_n - 1.
  ENDIF.

  CASE v_month_n .
    WHEN 4 OR 6 OR  9 OR 11.
      IF v_day_n = 31.
        v_day_n = 30.
      ENDIF.
    WHEN 2.
      v_mod1 = v_year_n MOD  4.
      v_mod2 = v_year_n MOD 400.
      v_mod3 = v_year_n MOD 100.
      IF ( ( v_mod1 = 0 ) OR ( v_mod2 = 0 ) ) AND ( v_mod3 <> 0 ).
        IF ( v_day_n > 29 ).
          v_day_n = 29.
        ENDIF.
      ELSE.
        IF ( v_day_n > 28 ).
          v_day_n = 28.
        ENDIF.
      ENDIF.
  ENDCASE.

  v_year_c = v_year_n.
  v_month_c = v_month_n.

  CONCATENATE v_year_c v_month_c v_day_c INTO v_date_c.
  p_v_date = v_date_c.
ENDFORM.                    " getdate

*&---------------------------------------------------------------------*
*&      Form  calc_shlf
*&---------------------------------------------------------------------*
*       计算当前库龄
*----------------------------------------------------------------------*
*      -->P_WA_RESULT_BUDAT  text
*----------------------------------------------------------------------*
FORM calc_shlf  USING    p_budat  "报产日期
                CHANGING p_shlf. "库龄
  DATA:v_year_n_sy TYPE i,
       v_year_n TYPE i,
       v_year_c(4TYPE c,
       v_month_n_sy TYPE i,
       v_month_n TYPE i,
       v_month_c(2TYPE c,
       v_day_n_sy TYPE i,
       v_day_n TYPE i,
       v_day_c(2TYPE c,
       v_year_diff TYPE i,
       v_month_diff TYPE i,
       v_day_diff TYPE i,
       v_mod_4 TYPE i,
       v_mod_100 TYPE i,
       v_mod_400 TYPE i.

  v_year_n_sy = sy-datum+0(4).  " current year
  v_month_n_sy = sy-datum+4(2). " current month
  v_day_n_sy = sy-datum+6(2).   " current day

  v_year_n = p_budat+0(4).
  v_month_n = p_budat+4(2).
  v_day_n = p_budat+6(2).

  v_day_diff = sy-datum - p_budat.

  IF ( v_day_diff > 365 ) .
    v_year_diff = v_day_diff / 365" 取模
  ENDIF.

  IF ( v_month_n_sy < v_month_n ).
    v_month_diff = v_month_n_sy + 12 - v_month_n.
  ELSE.
    v_month_diff = v_month_n_sy - v_month_n.
  ENDIF.

  v_day_diff = v_day_n_sy - v_day_n.

  IF ( v_day_diff < 0 ).
    v_month_diff = v_month_diff - 1.
  ENDIF.

  CASE v_month_n.
    WHEN 4 OR 6 OR  9 OR 11.                                " 30 days
      PERFORM calc_day_diff USING 30 v_day_diff
                                                      v_day_n v_day_n_sy
                                  CHANGING v_day_diff.
    WHEN 1 OR 3 OR 5 OR 7 OR 8 OR 10 OR 12 .   " 31 days
      PERFORM calc_day_diff USING 31 v_day_diff
                                                       v_day_n v_day_n_sy
                                  CHANGING v_day_diff.
    WHEN 2.                                      " 28 or 29 days
      v_mod_4     = v_year_n MOD  4.
      v_mod_400 = v_year_n MOD 400.
      v_mod_100 = v_year_n MOD 100.
      IF ( ( v_mod_4 = 0 ) OR ( v_mod_400 = 0 ) ) AND ( v_mod_400 <> 0 ).
        PERFORM calc_day_diff USING 29 v_day_diff
                                                         v_day_n v_day_n_sy
                                    CHANGING v_day_diff.
      ELSE.
        PERFORM calc_day_diff USING 28 v_day_diff
                                                         v_day_n v_day_n_sy
                                    CHANGING v_day_diff.
      ENDIF.
  ENDCASE.

  p_shlf = space.

  IF ( v_year_diff > 0 ).
    v_year_c = v_year_diff.
    CONCATENATE v_year_c '年'  INTO  p_shlf.
  ENDIF.

  IF ( v_month_diff > 0 ).
    v_month_c = v_month_diff.
    CONCATENATE p_shlf v_month_c  '月'  INTO  p_shlf.
  ENDIF.

  IF ( v_day_diff >= 0 ).
    v_day_c = v_day_diff.
    CONCATENATE p_shlf v_day_c  '天'  INTO  p_shlf.
  ENDIF.

ENDFORM.                    "2 calc_shlf

*&---------------------------------------------------------------------*
*&      Form  calc_day_diff
*&---------------------------------------------------------------------*
*       计算间隔日期
*----------------------------------------------------------------------*
FORM calc_day_diff  USING  p_days_per_month
                                             p_day_diff_value
                                             p_day_n
                                             p_day_n_sy
                        CHANGING p_day_diff.
  IF (  p_day_diff_value < 0 ).
    p_day_diff = p_days_per_month  - p_day_n + p_day_n_sy.
  ELSE.
    IF ( p_day_n_sy > p_days_per_month  ).
      p_day_diff = p_days_per_month - p_day_n.
    ELSE.
      p_day_diff = p_day_n_sy - p_day_n.
    ENDIF.
  ENDIF.
ENDFORM.                    " calc_day_diff

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
1 按照某种格式输出系统时间:自学java中的时间。自学Date类(java.util.Date)和SimpleDateFormat类,用程序输出“当前时间是XXXXXXXXXXXXXX秒(第XX周,周X)” 2 比较String与StringBuffer、StringBuilder的自增速度。方法:在自增前记录系统时间,进行5000次自增,然后再记录系统时间,可以得出自增的速度。获取系统时间的方法是java.lang.System.currentTimeMillis() ,见JDK API。 3 定义点类,圆是由圆心(点)和半径组成的,请完成圆类,注意“派”为常量,取3.14。圆类具有judge函数可以判断两圆的关系:相离、相交(包括相切)、嵌套、重合。设计static成员用以求所有圆对象的平均面积。(static、final) 4 图形间的关系可以下图用来表现。所有的图形中都可以称为Shape。由这个类可以派生出二维图形TwoDimensionalShape和三维图形ThreeDimensionalShape类。每个TwoDimensionalShape类应包括成员函数getArea以计算二维图形的面积。每个ThreeDimensionalShape类包含成员函数getArea和getVolume,分别计算三维图形的表面积和体积。编写一个程序,用一个数组乘放各种图形类对象(包括二维和三维的),并输出对象得相应信息。如果某个图形是TwoDimensionalShape就显示其面积,如果某个图形是ThreeDimenionalShape,则显示其面积和体积。请完成图中所有的类并在主函数中做测试。(继承与多态)
程序名:国内山寨随机视频聊天 v1.1beta 演 示:http://ybyt.com/chat 官 方:http://ddpoo.com 修 改:shileiye 邮 件:shileiye@qq.com 时 间:2010.4.6 安装说明: 1、本程序需要用到Google的地图KEY,因此你先要免费申请一个GG的地图密匙,申请地址:http://code.google.com/intl/zh-CN/apis/maps/signup.html 2、申请到类似“ABQIAAAA54YSddnq2S4aS6WRs-jSNRRxJ3KsNDxbOF8X47Xxn0Jf1cNodRRMT-FmiX_vEKM1rEGDeGW2W7Cebw”这样的密匙之后用记事本打开Index.htm和Other/v.js查找这段密匙替换成你的即可。 3、打开Other/v.js找到“http://ybyt.com/chat/”替换为你程序所在的网址。 4、上传所有文件到你的网站访问即可。 程序说明: 上次发布了一个国外随机视频聊天程序,没有署名,没有说明,败笔啊!这次写个说明先。 本程序并不是完整的,因为涉及到从服务器获取数据,所以几个关键文件是连接到山寨随机视频的服务器的。主要用于获取视频对象数据。所以程序里某些地址不能更改,更改就会出问题。另外请山寨头子表来找我,关键性的东西还是在你手里头。别人安装了本程序也是以你的服务器为基准的,用户必须通过你的服务器才能获取聊天对象,就算别人把看的到的版权全改了对你也是有利的,毕竟别个免费帮你聚拢人气了,杂个说都是双赢的局面。当然,主动权再你,你完全可以在服务器上弄点小把戏,让这个程序失去意义。 在Index.htm页面有一段统计代码,一个是官方的,一个是我的,希望大家不要删除,官方的自然是让山寨头子晓得具体的流量信息。我的嘛,也只是看看程序的流通情况,以便后续是否有跟随官方升级的可能。代码都是隐藏的,完全不会影响程序性能及使用,请勿担心。实在觉得碍眼,删就删吧。写套程序很困难,抠别人程序也不容易呐! 好了,最后一句,本程序不保证长期有效,如果失效,请到http://ybyt.com看看有没更新。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值