用java 输出合理的日期,从一月到12月。4,6,9,11月有30天,2月 28天,其他都是31天

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用java 输出合理的日期,从一月到12月。4,6,9,11月有30天,2月 28天,其他都是31天相关的知识,希望对你有一定的参考价值。

参考技术A import java.util.Calendar;
class CalendarText

int allday;

Calendar cal;

public void init(int m, int n)
int[] days = 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ;
cal = Calendar.getInstance();
cal.set(Calendar.YEAR, m);
cal.set(Calendar.MONTH, n - 1);
cal.set(Calendar.DATE, 1);
if ((m % 4 == 0 && m % 100 != 0 || m % 400 == 0) && n == 2)
days[1]++;
allday = days[n - 1];


public void print(int x, int y)
System.out.println("------------" + x + "年" + y + "月份------------\n");
System.out.println("SUN\tMON\tTUR\tWED\tTHU\tFRI\tSAT");

int first = cal.get(Calendar.DAY_OF_WEEK);
for (int i = 1; i < first; i++)
System.out.print("\t");

for (int i = 1; i <= allday; i++)
System.out.print(i + "\t");
if (first++ % 7 == 0)
System.out.println();



public static void main(String[] args) throws Exception
int year = 2008;
int month = 10;
CalendarText myjava = new CalendarText();
myjava.init(year,month);
myjava.print(year, month);

参考技术B package test;

import java.text.SimpleDateFormat;
import java.util.Date;

public class AllYearString

public static void main(String[] args)

AllYearString ays = new AllYearString();
String[] str = ays.getDays();
if (null != str)

for (int i = 0;i < str.length;i ++)

System.out.println(str[i]);




/**
*
* @return String[]一年中所有日子的字符串数组。
*/
private String[] getDays()

Date[] date = getFirstAndLastDays();
long l2 = date[1].getTime();
String str = "";
for (long l1 = date[0].getTime();l1 <= l2;l1 += 1000*3600*24)

str += formatDate(new Date(l1)) + "#";

return str.split("#");


/**
* 获得当年的第一天。
* @return Date数组。第一位是当年的第一天和第二位是当年的最后一天。
*/
private Date[] getFirstAndLastDays()

Date date = new Date();
String dateStr = formatDate(date);
String year = dateStr.substring(0,4);

//当年第一天的字符串形式。
String firstDayStr = dateStr.replaceFirst(year + "-\\d2-\\d2",year + "-01-01");

//当年最后一天的字符串形式。
String lastDayStr = dateStr.replaceFirst(year + "-\\d2-\\d2",year + "-12-31");

Date firstDay = formatString(firstDayStr);
Date lastDay = formatString(lastDayStr);
return new Date[]firstDay,lastDay;


/**
* 将时间转为字符串。
* @return String。传入时间的格式化字符串。
* @param Date date。需要格式化的时间。
*/
private String formatDate(Date date)

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.format(date);


/**
* 将字符串转化为JAVA时间类型。
* @return Date date。JAVA时间类型。
* @param String。字符串。
*/
private Date formatString(String dateStr)

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try

return sdf.parse(dateStr);

catch (Exception e)

return null;


参考技术C 汗颜~ 参考技术D 你能把需求说清楚点吗?是用户输入一个月份,然后程序输出对应的天数吗?要是这样用一个简单的switch,case就行了

可变日期长度的 Java 正则表达式模式

【中文标题】可变日期长度的 Java 正则表达式模式【英文标题】:Java Regex Pattern for variable date length 【发布时间】:2019-08-24 09:03:16 【问题描述】:

需要:设置一个正则表达式模式来提取作为字符串子集的日期信息。

问题:月份和日期不是固定长度,即一月到九月用一位数表示,十月到十二月用两位数表示。日期 1 到 9 也是个位数,10 - 31 是 2 位数

字符串可以是以下任何一种格式:

"CompanyUIP198710800ST" : Name YYMD nnnnn cc (i.e. CompanyUIP 1987 10800 ST)
"CompanyA1982210800ST"  : Name YYMDD nnnnn cc (i.e. CompanyA 19822 10800 ST)
"CompanyVT191039405YT"  : Name YYMMD nnnn cc (i.e. CompanyVT 19103 9405 YT)
"CompanyBX1910249405YT" : Name YYMMDD nnnn cc (i.e. CompanyBX 191024 9405 YT)

在上面:

第一部分是公司名称 接下来的 4 或 6 位数字代表日期 接下来的几位数字(可变长度)代表标识号 最后 2 个字符是后缀 appender,总是 2 个字符

模式:我可以使用以下正则表达式获取公司名称部分

stringWord.replaceFirst("^(\\D+).*$", "$1") 

我尝试了下面的,它看起来很笨拙,而且因为我不知道一开始的月份或日期的长度,我需要将 lengthDate 变量替换为 4、5 和 6,然后删除错误的变量(即更多步骤和笨拙)。

int lengthDate = 4;
stringWord.substring(stringWord.replaceFirst("^(\\D+).*$", "$1").length(),
                       stringWord.replaceFirst("^(\\D+).*$", "$1").length() + lengthDate);

希望我面临的问题是明确的,并等待有关如何使用单一正则表达式模式实现所有 4 种日期格式的建议。

【问题讨论】:

不确定是否可以区分所有月份和日期的组合,但请尝试^\D+(\d2)(1[012]|[1-9])(3[01]|[12][0-9]|[1-9])\d+[A-Z]2$regex101.com/r/Jd5bX5/1 格式不明确。 ...2019111 应该是 2019-11-01 还是 2019-01-11 CompanyBX191119405YT 的预期匹配是什么 在你们上面提到的特殊情况下,如果我们在10月或11月或12月,接下来的2位数字将被假定为月份,如果不是月份将被假定为为 1 位数。我知道这不是一个好习惯,但考虑到字符串格式,这是我能想到的最好的提取这些信息的方法。此外,此提取每周进行一次,因此不会出现遗留日期问题。也欢迎任何替代建议。 【参考方案1】:

有一些用于分隔数字的逻辑,您可能希望查看您的数据并提出一些不同的表达式,每个表达式将覆盖您的数据的一部分,然后使用交替连接它们。

例如,在我看来我们有两个类:

^(\D+)([0-9]4,)(9[0-9]3)([A-Z]2)$

^(\D+)([0-9]4,)([0-9]5)([A-Z]2)$

把它们结合起来,就可以了:

^(\D+)([0-9]4,)(9[0-9]3)([A-Z]2)$|^(\D+)([0-9]4,)([0-9]5)([A-Z]2)$

测试

import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class re
    public static void main(String[] args)

        final String regex = "^(\\D+)([0-9]4,)(9[0-9]3)([A-Z]2)$|^(\\D+)([0-9]4,)([0-9]5)([A-Z]2)$";
        final String string = "CompanyUIP198710800ST\n"
             + "CompanyA1982210800ST\n"
             + "CompanyVT191039405YT\n"
             + "CompanyBX1910249405YT";

        final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
        final Matcher matcher = pattern.matcher(string);

        while (matcher.find()) 
            System.out.println("Full match: " + matcher.group(0));
            for (int i = 1; i <= matcher.groupCount(); i++) 
                System.out.println("Group " + i + ": " + matcher.group(i));
            
        

    

正则表达式电路

jex.im 可视化正则表达式:


如果您想探索/简化/修改表达式,它已经 在右上角的面板上进行了解释 regex101.com。如果你愿意,你 也可以在this link看,怎么搭配 针对一些样本输入。


【讨论】:

谢谢,同意格式不正确。我已要求向我提供 XML 文件的人,以确保我收到的日期格式是标准的。同时会尝试调整您的建议,因为它无法识别某些情况例如:CompanyUIP19119450ST

以上是关于用java 输出合理的日期,从一月到12月。4,6,9,11月有30天,2月 28天,其他都是31天的主要内容,如果未能解决你的问题,请参考以下文章

java中Date

在EXCEL中,今天到下个月今天的天数怎么计算,求教了

2246=时间日期格式转换(JAVA)

一月分四周的JAVA实现方法

在java中怎么实现日历从一月到十二月依次展开

java 日期