java日期问题 如何将给定的俩时间 之间的月份列出来

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java日期问题 如何将给定的俩时间 之间的月份列出来相关的知识,希望对你有一定的参考价值。

比如:action接收到俩时间
开始时间 :"2011--8-15"
结束时间:"2012-2-16"
得出结果:2011-8 2011-9 2011-10 2011-11 2011-12 2012-1 2012-2

参考技术A 送你一个方法。
public static String getRelativeDate(java.util.Date date, int iYear, int iMonth, int iDate, String sFormat)
SimpleDateFormat sdf = new SimpleDateFormat(sFormat); //定义格式
GregorianCalendar gc = new GregorianCalendar();

gc.setTime(date);

gc.add(Calendar.YEAR, iYear);
gc.add(Calendar.MONTH, iMonth);
gc.add(Calendar.DATE, iDate);

return sdf.format(gc.getTime());

使用方法如下
Date date = new SimpleDateFormat("yyyy-MM-dd").parse("2011-8-15");//格式化日期字符串
System.out.println(DateUtil.getRelativeDate(date,0,1,0,"yyyy-MM"));//获取下一月,打印“2011-09”

针对你的问题,那就是,开始时间,月份循环+1,直到年月,与结束时间相同,就停止。
参考技术B 年份2011 能得到吧,2012 也能得到吧,2012 -2 包括2 以前的月,2011 包括8以后的月份,然后拼接字符串就行了嘛,可以准备一个数组里面由1,2,。。。12 个月,也就是12个数字,很简单的 参考技术C 代码
------------------------------------------------------------------------
import java.text.SimpleDateFormat;
import java.util.Calendar;

public class Test

public static void main(String[] args) throws Exception
SimpleDateFormat ymd = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat ym = new SimpleDateFormat("yyyy-MM");
String startTime = "2011-8-15";
String endTime = "2012-2-16";
Calendar startDate = Calendar.getInstance();
Calendar endDate = Calendar.getInstance();

startDate.setTime(ymd.parse(startTime));
endDate.setTime(ymd.parse(endTime));
String endYm = ym.format(endDate.getTime());

while (true)
String strYm = ym.format(startDate.getTime());
System.out.println(strYm);
if (strYm.equals(endYm))
break;

startDate.add(Calendar.MONTH, 1);




结果
---------------------------------------
2011-08
2011-09
2011-10
2011-11
2011-12
2012-01
2012-02

如何使用查询获取两个给定日期之间的月份列表?

【中文标题】如何使用查询获取两个给定日期之间的月份列表?【英文标题】:How to get a list of months between 2 given dates using a query? 【发布时间】:2011-10-19 02:35:15 【问题描述】:

我有 2 个日期,例如 2011 年 3 月 28 日和 2011 年 6 月 29 日。我需要一个 sql 查询来显示这两个日期之间的月份,包括包含日期的月份,即。六月、五月、四月和三月。

【问题讨论】:

【参考方案1】:

类似的东西

SQL> ed
Wrote file afiedt.buf

    select to_char( add_months( start_date, level-1 ), 'fmMonth' )
      from (select date '2011-03-30' start_date,
                   date '2011-06-29' end_date
              from dual)
     connect by level <= months_between(
                           trunc(end_date,'MM'),
                           trunc(start_date,'MM') )
  *                      + 1
SQL> /

TO_CHAR(ADD_MONTHS(START_DATE,LEVEL-
------------------------------------
March
April
May
June

应该可以。

【讨论】:

好吧,即使是盲松鼠也会偶尔发现坚果。【参考方案2】:

将添加此解决方案只是因为我认为它比其他解决方案更清洁:

SELECT ADD_MONTHS(TRUNC(TO_DATE('28-Mar-2011', 'DD-MON-YYYY'), 'MON'), ROWNUM - 1) date_out
FROM   DUAL
CONNECT BY ADD_MONTHS(TRUNC(TO_DATE('28-Mar-2011', 'DD-MON-YYYY'), 'MON'), ROWNUM - 1)
    <= TRUNC(TO_DATE('29-Jun-2011', 'DD-MON-YYYY'), 'MON')

【讨论】:

【参考方案3】:

你可以使用函数MONTHS_BETWEEN

SELECT MOD( TRUNC( MONTHS_BETWEEN( '2011-07-29', '2011-03-28' ) ), 12 ) as MONTHS
FROM DUAL

输出

    MONTHS
----------
         4

【讨论】:

我需要月份作为输出,即。三月、四月、五月和六月。不是 4。 对不起,我误解了你的问题。你应该检查贾斯汀洞穴的答案。没错。【参考方案4】:

几天前我需要一个答案。我找到了另一个我更喜欢的解决方案:

select to_char(which_month, 'Mon-yyyy') month
from
(
    select
        add_months(to_date(:start_date,'mm-yyyy'), rownum-1) which_month
    from
        all_objects
    where
        rownum <= months_between(to_date(:end_date,'mm-yyyy'), add_months(to_date(:start_date,'mm-yyyy'), -1))
    order by
        which_month
)

您当然可以使用任何您想要的格式。我对另一组“联合”并求和,这样即使没有结果,我也能得到月份。

【讨论】:

感激,准确回答我想要的:)【参考方案5】:
SELECT MIN (to_date((TO_CHAR (Actual_Date, 'DD-MM-RRRR')),'dd-mm-rrrr')) F_DATE,
         MAX (to_date((TO_CHAR (Actual_Date, 'DD-MM-RRRR')),'dd-mm-rrrr')) T_DATE,
         TO_CHAR (Actual_Date, 'MM-RRRR') TRX_MONTH     
    FROM (    SELECT TRUNC (TO_DATE (:P_FDATE, 'dd-mm-rrrr')) + LEVEL - 1
                        Actual_Date
                FROM (SELECT TRUNC (TO_DATE (:P_FDATE, 'dd-mm-rrrr'), 'MM') - 1
                                AS dt
                        FROM DUAL)
          CONNECT BY LEVEL <=
                        (  TO_DATE (:P_TDATE, 'dd-mm-rrrr')
                         - TRUNC (TO_DATE (:P_FDATE, 'dd-mm-rrrr'))
                         + 1))
GROUP BY TO_CHAR (Actual_Date, 'MM-RRRR')
ORDER BY 1

【讨论】:

请将代码缩进 4 个空格以激活语法高亮。此外,通常会感谢添加一些解释性文字(特别是如果已经有公认的答案,请说出您的解决方案有何不同)。【参考方案6】:
     declare 
        v_date_from_first_day date;
        v_date_to_last_day date;
        v_month_name varchar2(10);
        v_month_number number;
        v_year_number number;
        v_month_diff number;
        begin
          v_date_to_last_day := to_date('31.12.2018'); 
          v_date_from_first_day := to_date('01.01.2018');

          select months_between(v_date_to_last_day,v_date_from_first_day) as diff into v_month_diff from dual;

          for i in 1..round(v_month_diff, 2) loop
          select 
          to_char(trunc(add_months(v_date_to_last_day - months_between(v_date_from_first_day, v_date_to_last_day), -i)), 'fmMonth') as month_nm,
          to_char(trunc(add_months(v_date_to_last_day - months_between(v_date_from_first_day, v_date_to_last_day), -i)), 'MM') as month_num,
          to_char(trunc(add_months(v_date_to_last_day - months_between(v_date_from_first_day, v_date_to_last_day), -i)), 'YYYY') as year_num
          into v_month_name, v_month_number, v_year_number
          from dual;

          dbms_output.put_line(v_month_number || '/' || v_year_number);
dbms_output.put_line(v_month_name || '/' || v_year_number);
          end loop;
        end;

        Output: 
        12/2018
        11/2018
        10/2018
        9/2018
        8/2018
        7/2018
        6/2018
        5/2018
        4/2018
        3/2018
        2/2018
        1/2018

这里,月份名称是克罗地亚语

Prosinac/2018
Studeni/2018
Listopad/2018
Rujan/2018
Kolovoz/2018
Srpanj/2018
Lipanj/2018
Svibanj/2018
Travanj/2018
Ožujak/2018
Veljača/2018
Siječanj/2018

【讨论】:

您好,欢迎来到 SO,请阅读How to Answer 上的指南。您还可以更好地记录您的 Codesample 以帮助人们了解它的作用。 对不起。我第一次来这里。未来我会做得更好。 没关系 :) 一定要纠正它,让它对阅读它的人尽可能有用。

以上是关于java日期问题 如何将给定的俩时间 之间的月份列出来的主要内容,如果未能解决你的问题,请参考以下文章

Java - 在指定的给定月份 - 年份范围内打印每个月的第一个和最后一个日期

如何在 Oracle SQL 中使用月份作为日期列

将月份和年份列转换为带有附加字符串连接的日期列

EXCEL:如果“日期列”中的 DATE 介于 1 月 10 日至 2 月 10 日之间,则在“月份列”中返回“JAN” - 其余时间以此类推

如何在两个日期之间将所有年份、月份显示为 int?

MySQL中日期之间的月份差异