JAVA: 如何显示比当前DATE时间,提前一个月的时间

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA: 如何显示比当前DATE时间,提前一个月的时间相关的知识,希望对你有一定的参考价值。

比如,
当前DATE时间是: 2008/11/05
我想显示的是 : 2008/10/05

当前DATE时间是: 2008/01/05
我想显示的是 : 2007/12/05

如上,谢谢!!!

Date date = new Date();//当前日期
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");//格式化对象
Calendar calendar = Calendar.getInstance();//日历对象
calendar.setTime(date);//设置当前日期
calendar.add(Calendar.MONTH, -1);//月份减一
System.out.println(sdf.format(calendar.getTime()));//输出格式化的日期
参考技术A import java.text.*;
import java.util.*;

public class MonthReduce

public static String getMonthReduce(String datetime)

try

SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");// 格式化对象
Calendar calendar = Calendar.getInstance();// 日历对象
Date date = sdf.parse(datetime);
calendar.setTime(date);
System.out.println("输入的时间: \t" + sdf.format(calendar.getTime()));
calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) - 1);
datetime = sdf.format(calendar.getTime());// 输出格式
catch (Exception e)
e.printStackTrace();

return datetime;


public static void main(String[] args)
String str = "2008/01/05";
System.out.println("一个月后: \t" + getMonthReduce(str));
// str任你换喽 但是格式得是 yyyy/MM/dd 你自己可以完善一下哦


参考技术B 用Calander类,这个类有一个方法add(Calander.MONTH,-1)即是减去一个月后的时间,再变成字符串就行了.. 参考技术C 减一不就行了

使用 Instant/ChronoUnit 获取今天午夜的 nanos-since-epoch 时间比使用 GregorianCalendar/Date 提前 24 小时

【中文标题】使用 Instant/ChronoUnit 获取今天午夜的 nanos-since-epoch 时间比使用 GregorianCalendar/Date 提前 24 小时【英文标题】:Using Instant/ChronoUnit to get the time in nanos-since-epoch at midnight today is 24 hours ahead of using GregorianCalendar/Date 【发布时间】:2021-05-17 09:06:09 【问题描述】:

我正在尝试从 Epoch 午夜(例如 2021 年 2 月 13 日 00:00:00)开始以 nanos 形式获取今天的日期。

使用 GregorianCalendar/Date 似乎可以得到正确的结果。

我使用 Instant/ChronoUnit 的方式是明天午夜给我(例如 2021 年 2 月 14 日 00:00:00)。

这里有什么问题?

import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Calendar;
import java.util.TimeZone;


class scratch 

    public static void main(String[] args) 
        Calendar c = new GregorianCalendar();
        c.setTime(new Date());
        c.set(Calendar.HOUR_OF_DAY, 0);
        c.set(Calendar.MINUTE, 0);
        c.set(Calendar.SECOND, 0);
        c.set(Calendar.MILLISECOND, 0);
        c.setTimeZone(TimeZone.getTimeZone("UTC"));
        long dateNanos = c.getTimeInMillis() * 1000000L;

        Instant i = Instant.now().truncatedTo(ChronoUnit.DAYS);
        long instantNanos = ChronoUnit.NANOS.between(Instant.EPOCH, i);

        System.out.println("dateMillis = " + dateNanos);
        System.out.println("instantMillis = " + instantNanos);
        System.out.println("instantMillis - dateMillis = " + (instantNanos - dateNanos));
    

trucatedTo 似乎正在四舍五入。 javadocs 说它四舍五入。

例如,使用 MINUTES 单位截断将向下舍入到最接近的分钟,将秒和纳秒设置为零。

【问题讨论】:

【参考方案1】:

这些会给出不同的结果,因为您在不同的时区“截断到当天”。请注意,当您在不同的时区时,“截断到当天”会给您不同的答案,因为“午夜”的时刻在不同的时区是不同的。由于 DST 更改,某些时区甚至没有时间 00:00:00。

Calendar 版本中,您将截断到系统时区中的日期。请注意,setTimeZone 调用发生在截断之后,因此它实际上并没有做任何有用的事情。

Instant 版本中,您将截断到UTC 的日期,因为Instants 中没有“时区”的概念。

Instant 只是“错误”,因为您希望它在您的系统时区中截断为一天。 Instant 并不是真的要这样做。你应该使用ZonedDateTime:

ZonedDateTime now = ZonedDateTime.now(); // this gets the current ZonedDateTime, you can also specify a specific zone
System.out.println(now.truncatedTo(ChronoUnit.DAYS).toEpochSecond() * 1_000_000_000L);

另一方面,如果您希望 Calendar 在 UTC 时区截断,请在截断之前调用 setTimeZone

Calendar c = new GregorianCalendar();
c.setTime(new Date());
c.setTimeZone(TimeZone.getTimeZone("UTC"));
c.set(Calendar.HOUR_OF_DAY, 0);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
c.set(Calendar.MILLISECOND, 0);

但我仍然建议您尽可能使用java.time :)


您现在应该做的是确定您指的是哪个“午夜”(哪个时区的午夜?)。

【讨论】:

谢谢。是的,这正是问题所在。看到这两个不同,我什至没有想到当前时间的 UTC 实际上是明天。顺便说一句,在测试您的答案时,我发现 c.setTimeZone 必须在 c.setTime 之前出现。 @marathon 真的吗?把它放在setTime 之后对我有用……我想这是不使用Calendar 的另一个原因:D

以上是关于JAVA: 如何显示比当前DATE时间,提前一个月的时间的主要内容,如果未能解决你的问题,请参考以下文章

在java中当前时间取整到小时如何做, 比如当前时间为下午2点半,想得到一个Date型变量,格式化后显示为:

使用 Instant/ChronoUnit 获取今天午夜的 nanos-since-epoch 时间比使用 GregorianCalendar/Date 提前 24 小时

java 日期比较(compareTo)

如何用java比较两个时间或日期的大小

如何获取当前的日期和时间

java显示当前时间中月份比系统时间小一个月????