Java的日期类都是怎么用的

news/2024/9/30 15:24:44

Java中的Date

为什么用类表示日期,而不是像其他语言中那样用一个内置(built-in)类型来表示?例如,Visual Basic 中有一个内置的 date 类型,程序员可以采用#12/31/1999格式指定日期。看起来这似乎很方便,程序员只需要使用内置的 date 类型而不用考虑类。但实际上,VisualBasic 这样设计合适吗?在有些地区,日期表示为月日/年,而另外一些地区则表示为日1月/年。语言设计者是否能够预见这些问题呢?如果没有处理好这类问题,语言就有可能陷入混乱,对此感到不满的程序员也会丧失使用这种语言的热情。如果使用类,这些设计任务就交给了类库的设计者。如果类设计得不完善,那么其他程序员可以很容易地编写自己的类,改进或替代(replace)这些系统类(作为印证:Java的日期类库开始时有些混乱,现在已经重新设计了两次)。

System.out.println(new Date());这个表达式会构造一个新对象啊你个,这个对象初始化为当前的日期和时间。image-20240926194346958

或者可以对刚构造的对象应用一个方法。Date类中有一个toString的方法。这个方法将生成日期的一个字符串描述。image-20240926194605240

在这两个例子中,构造的对象只使用了一次。通常,可能希望保留所构造的现象从而能继续使用,为此我们把对象存放在一个变量里Date rightnow = new Date(),rightnow引用了新构造的对象

image-20240926201214554

对象和对象变量之间存在着一个重要的区别

Date startTime定义了一个对象变量startTime,它可以引用Date类型的对象。但是,一定要认识到它不是一个对象,而且实际上它没有引用任何对象。所以无法调用startTime.toString()方法。所以必须首先初始化startTime变量,可以写成startTime = rightnow或者startTime = new Date(),这两种写法都引用了同一个对象image-20240926202640117

要认识到重要的一点:对象变量并不实际包含一个对象,它只是引用一个对象。在Java中,任何对象变量的值都是一个引用,指向存储在另外一个地方的某个对象。new 操作符的返回值也是一个引用。下面的语句:
Date startTime =new Date();有两个部分。表达式new Date()构造了一个Date类型的对象,它的值是新创建对象的一个引用。再将这个引用存储在 startTime 变量中。
可以显式地将对象变量设置为null,指示这个对象变量目前没有引用任何对象。image-20240926203001884

Java的对象变量虽然引用了对象,但是C++中没有null作用,而且引用不能赋值。应当把对象变量看作是类似于C++的对象指针,例如:
Date rightNow; // Java
实际上等同于
Date* rightNow; //C++
一旦建立了这种关联,一切就清楚了。当然,只有使用了new调用后Date * 指针才会初始化。就这一点而言,C++与 Java的语法儿乎是一样的。
Date* rightNow= new Date();//C++
如果把一个变量复制到另一个变量,两个变量就指向同一个日期,即它们是同一个对象的指针。Java中的null引用对应于C+中的NULL指针。
所有的Java对象都存储在堆中。当一个对象包含另一个对象变量时,它只是包含另一个堆对象的指针。
在C++中,指针十分令人头疼,因为它们很容易出错。稍不小心就会创建一个错误的指针,或者使内存管理出问题。在Java语言中,这些问题都不复存在。如果使用一个没有初始化的指针,那么运行时系统将会产生一个行时错误,而不是生成随机的结果。另外,你不必担心内存管理问题,垃圾回收器会处理相关的事宜。
C++确实做了很大的努力,它通过支持复制构造器和赋值送算符来实现对象的自动复制。例如,一个链表(linked list)的副本是一个新链表,其内客与原始链表相同但是有一组独立的链接。这样一来就可以适当地设计类,使它们与内置类型有相同的复制行为。在Java中,必须使用cone方法获得一个对象的完整副本。

LocalDate类

Java的时间是用距离一个固定时间点的毫秒数表示的,这个时间就是所谓

的纪元。它是UTC时间1970年1月1日00:00:00。UTC就是Coordinated Universal Time国际协调时间。

类库设计者决定将保存时间与给时间点命名分开。所以,标准Java类库分别包含了两个类:一个是用来表示时间点的 Date 类;另一个是用大家熟悉的日历表示法表示日期的 LocalDate类。Java8引人了另外一些类来处理日期和时间的不同方面--有关内容参见卷Ⅱ第6章。
将时间度量与日历分开是一种很好的面向对象设计。通常,最好使用不同的类表示不同的概念。
不要使用构造器来构造LocalDate类的对象。实际上,应当使用静态工厂方法(factorymethod),它会代表你调用构造器。下面的表达式:
LocalDate.now()会构造一个新对象,表示构造这个对象时的日期。
可以提供年、月和日来构造对应一个特定日期的对象:
LocalDate.of(1999,12,31)
当然,通常我们都希望将构造的对象保存在一个对象变量中:
LocalDate newYearsEve = LocalDate.of(1999, 12,31);
一旦有了一个 LocalDate对象,可以用方法getYear、getMonthValue和getDay0fMonth 得到年月和日:

image-20240926204551314

如果在向未来定一个时刻,比如增加1000天来计算是哪一天,我们可以使用plusday方法image-20240926204801966

Java库的一个比较早的版本曾经有过另一个处理日历的类,名为GregorianCalendar

GregorianCalendar someday = new GregorianCalendar(2000, 1, 27);
someday.add(Calendar.DAY_OF_MONTH, 1000);
int year = someday.get(Calendar.YEAR);
int month = someday.get(Calendar.MONTH);
int day = someday.get(Calendar.DAY_OF_MONTH);

image-20240926205600364

Eg:打印当月日历

import java.time.DayOfWeek;
import java.time.LocalDate;public class Main {public static void main(String[] args) {LocalDate date = LocalDate.now(); //首先构造一个对象,并用当前日期初始化//获取当前月日int month = date.getMonthValue();int today = date.getDayOfMonth();date = date.minusDays(today - 1);// 讲日期设置为当月第一天DayOfWeek weekday = date.getDayOfWeek();//并得到这一天是星期几int value = weekday.getValue();// 1=Monday,...,7= SundaySystem.out.println("Mon Tue Wed Thu Fri Sat Sun");for (int i = 1; i < value; i++)System.out.print("    ");while (date.getMonthValue() == month) {System.out.printf("%3d", date.getDayOfMonth());if (date.getDayOfMonth() == today) {System.out.print("*");} else {System.out.print(" ");}date = date.plusDays(1);if (date.getDayOfWeek().getValue() == 1)System.out.println();}if (date.getDayOfWeek().getValue() != 1)System.out.println();}
}

image-20240929172508929

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/66524.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

P7730 [JDWOI-1] 蜀道难

首先,区间增加定值并且要求单调不降,很容易想到差分。 于是先把 \(h\) 数组差分一下,题目的要求即为最小代价使得 \(h\) 均为非负数。 观察一下两种操作,发现 \(n\) 的范围很小,可以枚举操作的起点 \(i\) ,然后如果操作是压低,相当于 \(h[i]--,h[i+l[i]]++\) 。而如果操…

就叫它new Star2024 的WP好了

begin WP 跟着引导走就好,这个引导做的还不错,能教人怎么用IDAbase64 WP总算知道为啥面试会问我是不是不知道base64编码,原来这个就是啊,和北邮新生赛re签到题基本一样。 看懂逻辑,经典3并4后单表替换,然后写代码解决就好

洛谷题单指南-分治与倍增-P6648 [CCC2019] Triangle: The Data Structure

原题链接:https://www.luogu.com.cn/problem/P6648 题意解读:在一个n行的数字三角形中,求所有边长为k的正三角形最大值之和。 解题思路: 1、枚举法 枚举每一个边长为k的三角形,在其中求max,然后累加,n最多3000,时间复杂度是n^4,显然超时。 2、倍增和ST思想 此题非常类…

确保上传的缩略图在 PbootCMS 中保持清晰

config/config.php 文件中的相关部分:// 缩略图配置 ico => array(max_width => 1920, // 最大宽度1920max_height => // 最大高度不填写代表不限制 ),清除缓存清除系统缓存修改完配置文件后,需要清除系统缓存,确保配置更新生效。 在后台管理中找到“缓存管…

象形闽都 数智榕城 | PostgreSQL中文社区技术沙龙 - 福州站

在数字化浪潮席卷的时代,数据已成为推动社会进步与企业发展的核心动力。福建,作为东南沿海的经济与文化重镇,正以崭新的姿态拥抱数智未来。为促进福建地区数据库技术的交流与发展,我们诚挚邀请您参加“象行闽都,数智榕城 —— PostgreSQL数据库技术沙龙”。活动主题: 象行…

SSL证书必须要买吗?

在当今数字化的时代,网络安全日益成为人们关注的焦点。SSL证书作为一种保障网络安全通信的工具,是否必须购买成为许多人心中的疑问。 对于企业和商业网站来说,购买SSL证书往往是非常必要的。 首先,从用户信任的角度来看,当用户访问一个带有SSL证书的网站时,浏览器地址栏会…

PBOOTCMS的水印功能如何使用?pbootcms设置的水印为何没生效?

在 PbootCMS 中,水印功能主要用于给新上传的图片添加水印。如果你发现开启了水印功能但前端仍然没有水印,可能是因为以下几个原因:只对新上传的图片生效:水印功能仅对新上传的图片生效,之前上传的图片不会自动加上水印。 水印配置未生效:可能是因为水印配置没有正确设置或…

prometheus学习笔记之Grafana 常用操作

一、Panel 设置 1.单位设置2.Panel名称修改3.曲线别名 修改前修改后 4.曲线排序 5.曲线复制6.曲线静默 7.Panel复制 当前dashboard中复制跨dashboard或folder在其他dashboard中操作8.设置告警线设置告警条件其他按提示填写如果触发告警规则 则页面会有提示9.row效果如下:10.自…