java代码解析假设2016年9月1号是周一(第一周),怎么计算9月10号是第几周的周几急急急

java代码解析假设2016年9月1号是周一(第一周),怎么计算9月10号是第几周的周几急急急,第1张

Java8 的新时间API可以完爆以前的老API,哈哈,现在的API很简洁的,也好用只需要告诉程序要什么,而不是告诉程序如何去得到,这是一种命令式编程到声明式编程的思想的转变

public static void main(String[] args) {

    LocalDate localDate = LocalDateof(2016, 9, 10);

    Systemoutprintln(

            localDate + "是第" +

            localDateget(ChronoFieldALIGNED_WEEK_OF_MONTH) + "周的" +

            localDategetDayOfWeek()getDisplayName(TextStyleFULL, LocaleCHINA));

}

javautilCalendar

Calendar 类是一个抽象类,它为特定瞬间与一组诸如

YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为 *** 作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00000,格里高利历)的偏移量。

该类还为实现包范围外的具体日历系统提供了其他字段和方法。这些字段和方法被定义为 protected。

与其他语言环境敏感类一样,Calendar 提供了一个类方法

getInstance,以获得此类型的一个通用的对象。Calendar 的

getInstance 方法返回一个 Calendar 对象,其日历字段已由当前日期和时间初始化:

Calendar rightNow = CalendargetInstance();

Calendar 对象能够生成为特定语言和日历风格实现日期-时间格式化所需的所有日历字段值,例如,日语-格里高里历,日语-传统日历。Calendar 定义了某些日历字段返回值的范围,以及这些值的含义。例如,对于所有日历,日历系统第一个月的值是 MONTH ==

JANUARY。其他值是由具体子类(例如 ERA)定义的。有关此内容的细节,请参阅每个字段的文档和子类文档。

另外一个是 javautilDate

类 Date 表示特定的瞬间,精确到毫秒。

在 JDK 11 之前,类 Date 有两个其他的函数。它允许把日期解释为年、月、日、小时、分钟和秒值。它也允许格式化和解析日期字符串。不过,这些函数的 API 不易于实现国际化。从 JDK 11

开始,应该使用 Calendar 类实现日期和时间字段之间转换,使用 DateFormat 类来格式化和解析日期字符串。Date 中的相应方法已废弃。

尽管 Date 类打算反映协调世界时 (UTC),但无法做到如此准确,这取决于 Java

虚拟机的主机环境。当前几乎所有 *** 作系统都假定 1 天 = 24 × 60 × 60 = 86400 秒。但对于

UTC,大约每一两年出现一次额外的一秒,称为“闰秒”。闰秒始终作为当天的最后一秒增加,并且始终在 12 月 31 日或 6 月 30 日增加。例如,1995

年的最后一分钟是 61 秒,因为增加了闰秒。大多数计算机时钟不是特别的准确,因此不能反映闰秒的差别。

怎么才能愉快地处理日期和时间?答案是:立刻升级到Java 8!

Java 8新增了LocalDate和LocalTime接口,为什么要搞一套全新的处理日期和时间的API?因为旧的javautilDate实在是太难用了。

javautilDate月份从0开始,一月是0,十二月是11,变态吧!javatimeLocalDate月份和星期都改成了enum,就不可能再用错了。

javautilDate和SimpleDateFormatter都不是线程安全的,而LocalDate和LocalTime和最基本的String一样,是不变类型,不但线程安全,而且不能修改。

javautilDate是一个“万能接口”,它包含日期、时间,还有毫秒数,如果你只想用javautilDate存储日期,或者只存储时间,那么,只有你知道哪些部分的数据是有用的,哪些部分的数据是不能用的。在新的Java 8中,日期和时间被明确划分为LocalDate和LocalTime,LocalDate无法包含时间,LocalTime无法包含日期。当然,LocalDateTime才能同时包含日期和时间。

新接口更好用的原因是考虑到了日期时间的 *** 作,经常发生往前推或往后推几天的情况。用javautilDate配合Calendar要写好多代码,而且一般的开发人员还不一定能写对。

LocalDate

看看新的LocalDate怎么用:

// 取当前日期:

LocalDate today = LocalDatenow(); // -> 2014-12-24

// 根据年月日取日期,12月就是12:

LocalDate crischristmas = LocalDateof(2014, 12, 25); // -> 2014-12-25

// 根据字符串取:

LocalDate endOfFeb = LocalDateparse("2014-02-28"); // 严格按照ISO yyyy-MM-dd验证,02写成2都不行,当然也有一个重载方法允许自己定义格式

LocalDateparse("2014-02-29"); // 无效日期无法通过:DateTimeParseException: Invalid date

日期转换经常遇到,比如:

// 取本月第1天:

LocalDate firstDayOfThisMonth = todaywith(TemporalAdjustersfirstDayOfMonth()); // 2014-12-01

// 取本月第2天:

LocalDate secondDayOfThisMonth = todaywithDayOfMonth(2); // 2014-12-02

// 取本月最后一天,再也不用计算是28,29,30还是31:

LocalDate lastDayOfThisMonth = todaywith(TemporalAdjusterslastDayOfMonth()); // 2014-12-31

// 取下一天:

LocalDate firstDayOf2015 = lastDayOfThisMonthplusDays(1); // 变成了2015-01-01

// 取2015年1月第一个周一,这个计算用Calendar要死掉很多脑细胞:

LocalDate firstMondayOf2015 = LocalDateparse("2015-01-01")with(TemporalAdjustersfirstInMonth(DayOfWeekMONDAY)); // 2015-01-05

LocalTime

LocalTime只包含时间,以前用javautilDate怎么才能只表示时间呢?答案是,假装忽略日期。

LocalTime包含毫秒:

LocalTime now = LocalTimenow(); // 11:09:09240

你可能想清除毫秒数:

LocalTime now = LocalTimenow()withNano(0)); // 11:09:09

构造时间也很简单:

LocalTime zero = LocalTimeof(0, 0, 0); // 00:00:00

LocalTime mid = LocalTimeparse("12:00:00"); // 12:00:00

时间也是按照ISO格式识别,但可以识别以下3种格式:

12:00

12:01:02

12:01:02345

JDBC

最新JDBC映射将把数据库的日期类型和Java 8的新类型关联起来:

SQL -> Java

--------------------------

date -> LocalDate

time -> LocalTime

timestamp -> LocalDateTime

再也不会出现映射到javautilDate其中日期或时间某些部分为0的情况了。

JAVA 8 Time示例

import javatimeLocalDate;

import javatimeLocalDateTime;

import javatimeLocalTime;

import javatimeMonth;

import javatimetemporalChronoUnit;

public class Java8TimeDemo {

//LocalDate和LocalTime和String一样,是final修饰的不变类型,线程安全且不能修改。

public static void main(String[] args) {

// 取当前日期:

LocalDate today = LocalDatenow();

Systemoutprintln(today);

// 根据年月日取日期,月份从1开始到12 而不是javautildate里的月份从0到11:

LocalDate birthday = LocalDateof(2015, 10, 27);

long days = ChronoUnitDAYSbetween(birthday,today);

if(birthdayisBefore(today)){

Systemoutprintln("生日已过"+days+"天");

}else{

Systemoutprintln("还差"+Mathabs(days)+"天过生日");

}

int year = todaygetYear();//年

Systemoutprintln(year);

int month = todaygetMonthValue();//月

Systemoutprintln(month);

int day = todaygetDayOfMonth();//日

Systemoutprintln(day);

int dw = todaygetDayOfWeek()getValue();//星期几

Systemoutprintln("星期"+dw);

int dd = todaylengthOfMonth();//本月多少天

Systemoutprintln(dd);

boolean leapYear = todayisLeapYear();//是否是润年

Systemoutprintln(leapYear"是闰年":"不是闰年");

//LocalDate的实例。由于它是不可变类型,每次 *** 作都会产生一个新的实例,而原有实例不收任何影响。

LocalDate date = LocalDateof(1998, MonthNOVEMBER, 01);

date = datewithYear(2200); //设置年

Systemoutprintln(date);

date = dateplusMonths(2); //增加2个月 plus

Systemoutprintln(date);

date = dateminusDays(1);//减去1天

Systemoutprintln(date);

LocalTime now = LocalTimenow(); // 包含毫秒数

Systemoutprintln(now);

now = LocalTimenow()withNano(0); //清除毫秒数:

Systemoutprintln(now);

LocalDateTime dateTime = LocalDateTimenow();

Systemoutprintln(dateTime);

}

}

这个问题建议采用Java8的时间api来计算比较简单直接

由于是计算时间之间的间距,只有年月,没有涉及到时分秒,在Java8中的时间api已经抽象了这样的类-Period,它代表时间之间的年月日的间距,里面主要属性就三个,年月日

当然获得一个Period实例也就是要计算两个时间的间距,可以采用静态构造方法

Periodbetween(LocalDate startDateInclusive, LocalDate endDateExclusive)

这里面的两个参数就代表开始时间,结束时间,LocalDate是Java8里的表示年月日,也只表示年月日的类,由于楼主给的条件也只有年和月,为了更方便的去计算,我们就默认日为1,因此完整代码如下

Period between = Periodbetween(LocalDateparse("2012-03-01"), LocalDateparse("2018-08-01"));

Systemoutprintln(Stringformat("%d年%d月", betweengetYears(), betweengetMonths()));

运行结果如下:

Java8的时间Api对于时间的处理非常方便易用,以后遇到类似问题,不妨去Java8里时间Api里去看看

java为了支持多语言,没有固定的日期格式。你需要根据自己的需要指定日期格式,然后用dateformat类或者simpledateformat类来判断是否是正确的日期格式。下面的例子供参考。更详细的内容(比如yyyy,mm,dd各代表什么)可以参考javadoc。

public

class

dateutil

{

private

static

final

simpledateformat

dateformat

=

null;

static

{

//

指定日期格式为四位年/两位月份/两位日期,注意yyyy/mm/dd区分大小写;

dateformat

=

new

simpledateformat("yyyy/mm/dd");

//

设置lenient为false

否则simpledateformat会比较宽松地验证日期,比如2007/02/29会被接受,并转换成2007/03/01

dateformatsetlenient(false);

}

public

static

boolean

isvaliddate(string

s)

{

try

{

dateformatparse(s);

return

true;

}

catch

(exception

e)

{

//

如果throw

javatextparseexception或者nullpointerexception,就说明格式不对

return

false;

}

}

//

下面这个方法则可以将一个日期按照你指定的格式输出

public

static

string

formatdate(date

d)

{

return

dateformatformat(d);

}

}

下面是一个简单的 Java 程序示例,用于打印指定时间段内每个日期是星期几:

```java

import javatimeDayOfWeek;

import javatimeLocalDate;

public class BirthdayPrint {

public static void main(String[] args) {

int startYear = 2022; // 开始年份

int endYear = 2025; // 结束年份

for (int year = startYear; year <= endYear; year++) {

for (int month = 1; month <= 12; month++) {

for (int day = 1; day <= 31; day++) { // 最大值为 31,超出月份天数的部分会自动忽略

try {

LocalDate date = LocalDateof(year, month, day);

DayOfWeek dow = dategetDayOfWeek();

Systemoutprintln(date + " is " + dow);

} catch (Exception e) { // 如果日期非法,则会抛出异常,这里捕获并忽略即可

}

}

}

}

}

}

```

此程序使用 Java 8 中的 `LocalDate` 类和 `DayOfWeek` 枚举类型,循环遍历指定时间范围内的所有日期,并通过 `getDayOfWeek()` 方法获取每个日期对应的星期几。最后将所有结果输出到控制台。

需要注意的是,在本程序中,我们没有做任何错误处理,例如输入的起始和结束年份必须合法、超出日期范围的日期会被自动忽略等等情况需要根据实际需求进行适当处理。

以上就是关于java代码解析假设2016年9月1号是周一(第一周),怎么计算9月10号是第几周的周几急急急全部的内容,包括:java代码解析假设2016年9月1号是周一(第一周),怎么计算9月10号是第几周的周几急急急、如何在JDK1.8中愉快地处理日期和时间、如何在java8中愉快地处理日期和时间java8新增了localdate和localtim等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9316313.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存