转载——java中的时间操作

本文详细介绍Java中日期与时间的操作方法,包括获取当前时间、格式化时间、设置时间及时间的运算。并提供实用代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java中的时间操作

java中的时间操作不外乎这四种情况:

1、获取当前时间

2、获取某个时间的某种格式

3、设置时间

4、时间的运算

好,下面就针对这四种情况,一个一个搞定。

 

一、获取当前时间

 

有两种方式可以获得,第一种,使用Date类。

j2SE的包里有两个Date类,一个是java.sql.Date,一个是java.util.Date

这里,要使用java.util.Date。获取当前时间的代码如下

Date date = new Date();

date.getTime();

还有一种方式,使用System.currentTimeMillis();

 

这两种方式获得的结果是一样的,都是得到一个当前的时间的long型的时间的毫秒值,这个值实际上是当前时间值与1970年一月一号零时零分零秒相差的毫秒数。

当前的时间得到了,但实际的应用中最后往往不是要用这个long型的东西,用户希望得到的往往是一个时间的字符串,比如“2006618号”,或“2006-06-18”,老外可能希望得到的是“06-18-2006”,诸如此类等等。这就是下一个要解决的问题

 

二、获取某个时间的某种格式

 

获取时间的格式,需要用到一个专门用于时间格式的类java.text.SimpleDateFormat

首先,定义一个SimpleDateFormat变量

SimpleDateFormat sdf = new SimpleDateFormat("",Locale.SIMPLIFIED_CHINESE);

这个构造函数的定义如下:

SimpleDateFormat(String pattern, Locale locale)

第一个参数pattern,我们后面再解释,这里我们使用一个"",第二个参数,是用来设置时区的,这里用到了java.util.Locale这个类,这个类了面定义了很多静态变量,直接拿过来用就OK,我们把时区设置为Locale.SIMPLIFIED_CHINESE,只看名字,这个静态变量的意义已经很清楚了。

 

接下来我们使用这个SimpleDateFormat把当前时间格式化为一个如下格式的时间字符串“XXXXXXXX_XXXXXX秒”,代码:

sdf.applyPattern("yyyy年MM月dd日_HH时mm分ss秒");

String timeStr = sdf.format(new Date());

 

获取时间格式的函数是format,这个函数的参数是java.util.Date对象,这个没有什么花头。

要说明一下的是这个pattern,所谓的模式。这里,yyyy,MM,dd等,这就是模式。

我们可以在SimpleDateFormat的构造函数中指定模式,比如

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd",Locale.SIMPLIFIED_CHINESE);

也可以获取时间格式的时候使用applyPattern函数临时指定,上面的例子就是这样。

什么字符代表什么,这是j2se约定好的,设置模式的时候,我们可以使用约定好的字符加上任何我们想要的字符串。

j2se对字符所代表的模式的约定列表如下:

 

 

LetterDate or Time ComponentPresentation
GEra designatorText
yYearYear
MMonth in yearMonth
wWeek in yearNumber
WWeek in monthNumber
DDay in yearNumber
dDay in monthNumber
FDay of week in monthNumber
EDay in weekText
aAm/pm markerText 
HHour in day (0-23)Number
kHour in day (1-24)Number
KHour in am/pm (0-11) Number
h  Hour in am/pm (1-12) Number
m  Minute in hour Number
s  Second in minute Number
S  Millisecond Number  
z  Time zone  General time zone 
Z  Time zone RFC 822 time zone 

三,设置时间

现在设置时间,推荐 使用java.util.Calendar类来进行操作,因为java.util.Date类很多方法都过时了,
Calendar 类有很多重载的设置时间的方法
我们可以针对于某一项进行设置,也可以同时进行很多设置

voidset(int field, int value) 
          将给定的日历字段设置为给定值。
 voidset(int year, int month, int date) 
          设置日历字段 YEARMONTH 和 DAY_OF_MONTH 的值。
 voidset(int year, int month, int date, int hourOfDay, int minute) 
          设置日历字段 YEARMONTHDAY_OF_MONTHHOUR_OF_DAY 和 MINUTE 的值。
 voidset(int year, int month, int date, int hourOfDay, int minute, int second) 
          设置字段 YEARMONTHDAY_OF_MONTHHOURMINUTE 和 SECOND 的值。
其中第一个就是给特定的字段设值,后面三个就是针对多个字段赋值

四,时间运算

时间的运算,无外乎就是加加减减,然后比较谁早谁晚而已,这些需求JAVA的API已经帮我们实现的很好了。一般比较时间的可以用如下的方法
abstract  voidadd(int field, int amount) 
          根据日历的规则,为给定的日历字段添加或减去指定的时间量。
 booleanafter(Object when) 
          判断此 Calendar 表示的时间是否在指定 Object 表示的时间之后,返回判断结果。
 booleanbefore(Object when) 
          判断此 Calendar 表示的时间是否在指定 Object 表示的时间之前,返回判断结果。

第一个是给某个字段加上某个数量的时间,虽然这个方法名叫add ,我们要减也是调用它的,只不过我们传入的是负数。

其实JAVA对时间操作的支持还是挺丰富的。希望大家的日常的使用中有更多的发现。
<think>嗯,用户这次的问题是关于解决Windows系统下端口资源耗尽导致的java.net.BindException错误。用户明确提到了修改MaxUserPort和TcpTimedWaitDelay这两个注册表项,看来用户已经做过一些调研,但需要具体操作指导。 从用户提供的引用内容来看,这个问题通常发生在高并发测试场景下(比如用户引用了JMeter相关的资料),本质是Windows默认的临时端口范围太小(1024-5000),且TIME_WAIT状态回收太慢(默认240秒)。用户可能正在做压力测试,遇到了端口资源瓶颈。 用户的核心诉求很明确:如何通过调整系统参数永久解决这个问题。但值得注意的是,用户没有说明是开发环境还是生产环境,这点需要提醒潜在风险。另外用户似乎已经排除了应用层端口冲突的可能性(因为错误是connect而非bind),这点很专业。 准备分步骤说明注册表修改方法,因为这是最根本的解决方案。同时也要提供临时缓解措施(如调整JMeter参数),因为修改注册表需要重启。考虑到用户的技术水平(能精准定位到具体参数),可以使用专业术语但必须解释清楚每个参数的含义。 需要特别强调操作风险,比如注册表备份和重启要求——这类系统级修改一旦出错可能导致网络功能异常。最后补充原理说明,帮助用户理解为什么调整这两个值能解决问题,这样用户未来遇到类似问题能举一反三。 用户可能还会关心如何验证修改是否生效,所以需要提供netsh命令查看当前端口范围的方案。另外,虽然用户没问,但可以补充Linux下的对比方案(用sysctl),方便用户跨平台参考。</think>针对Windows系统下因端口耗尽导致的`java.net.BindException: Address already in use: connect`错误,可通过调整系统TCP/IP参数解决。以下是详细步骤和原理: ### 🔧 解决方案 1. **修改注册表参数**(需管理员权限): - **`MaxUserPort`**:增大可用临时端口范围 - 路径:`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters` - 类型:`DWORD (32位)` - 值名称:`MaxUserPort` - 值数据:`65534`(十进制) - 作用:将临时端口上限从默认5000提升到65534[^1][^2][^3] - **`TcpTimedWaitDelay`**:缩短端口回收时间 - 路径:同上 - 类型:`DWORD (32位)` - 值名称:`TcpTimedWaitDelay` - 值数据:`30`(十进制,单位:秒) - 作用:将TCP连接TIME_WAIT状态持续时间从默认240秒缩短至30秒[^1][^2] 2. **重启系统生效**: ```bash shutdown /r /t 0 ``` 3. **验证配置**: ```bash netsh int ipv4 show dynamicport tcp ``` 输出应包含: ``` 启动端口 : 1024 端口数 : 64511 # 即 65535-1024 ``` ### ⚠️ 注意事项 1. **操作风险**: - 修改前备份注册表(`文件 → 导出`) - 错误操作可能导致网络异常 2. **参数原理**: - **临时端口范围**:`1024` 到 `MaxUserPort` $$ \text{可用端口数} = \text{MaxUserPort} - 1024 $$ - **TIME_WAIT状态**:确保TCP可靠关闭,但过长会占用端口资源 $$ \text{回收速度} \propto \frac{1}{\text{TcpTimedWaitDelay}} $$ 3. **JMeter专项优化**(若适用): ```properties # 在jmeter.properties中增加 httpclient4.time_to_live=30 # 连接存活时间(秒) httpclient4.max_total_connections=1000 # 最大连接数 ``` ### 🌐 替代方案(无需重启) ```bash # 临时扩大端口范围(重启失效) netsh int ipv4 set dynamicport tcp start=1024 num=64511 ``` ### 📚 原理说明 当高并发请求时,Windows默认配置: - 仅提供 **3977个临时端口**(5000 - 1023) - 每个关闭的连接需等待 **240秒** 才释放 短时间内大量请求会耗尽端口池,触发: $$ \text{java.net.BindException} \propto \frac{\text{请求量} \times \text{等待时间}}{\text{可用端口数}} $$ 通过扩大端口池与加速回收,可显著提升系统并发能力[^3]。 --- ### ❓相关问题 1. 如何验证Windows当前TCP临时端口范围? 2. TIME_WAIT状态过短是否会导致TCP连接异常? 3. Linux系统下如何解决`Address already in use`错误? 4. JMeter压测时还有哪些常见网络错误需要优化? 5. 除了系统参数,应用程序如何复用连接避免端口耗尽? [^1]: 修改注册表键值提升端口上限 [^2]: 调整TIME_WAIT加速端口回收 [^3]: Windows默认端口限制与回收机制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值