代码之家  ›  专栏  ›  技术社区  ›  Yossale

用java获取今天的日期-我已经尝试了常规方法

  •  14
  • Yossale  · 技术社区  · 15 年前

    我试过了

    Calendar calendar = Calendar.getInstance(); 
    calendar.set(Calendar.HOUR, 0);        
    Date date1 = calendar.getTime();                             
    System.out.println(date1);
    

    Run:(这真是一团糟)

    如果计算机上的小时数为<中午12:00:Sun Mar 08 00:44:39 IST 2009

    如果计算机上的小时数为>中午12:00:Sun Mar 08 12:46:53 IST 2009

    所以我放弃了。

    所有的日期设置器都不推荐使用(大纪元时间除外),所以我也不想使用它们

    我唯一能想到的就是

    Calendar calendar = Calendar.getInstance();     
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
    String sDate = dateFormat.format(calendar.getTime());
    Date today = dateFormat.parse(sDate);
    

    还有其他选择吗?

    谢谢

    10 回复  |  直到 15 年前
        1
  •  26
  •   Damo    15 年前

    我用这个:

    public static Date startOfDay(Date date) {
       Calendar dCal = Calendar.getInstance();
       dCal.setTime(date);
       dCal.set(Calendar.HOUR_OF_DAY, 0);
       dCal.set(Calendar.MINUTE, 0);
       dCal.set(Calendar.SECOND, 0);
       dCal.set(Calendar.MILLISECOND, 0);
    
       return dCal.getTime();
     }
    
        2
  •  18
  •   Jon Skeet    15 年前

    java.util.{Calendar,Date} . 使用 Joda Time . 这样,您就可以将日期表示为 date DateMidnight 如果这就是你想要代表的。(注意时区和日期的组合,如果有 不过没有午夜……)

    您需要使用什么 Date 具有如果您可以在整个过程中改用Joda,那就太好了。否则,您可以使用Joda执行您想要的操作,然后将其转换为毫秒(然后转换为毫秒) java.util.Date

    (使用时,Michael的解决方案 / Calendar 如果你真的想坚持在一个坏的API中,这是很好的。。。但我不能夸大乔达有多好……)

        3
  •  10
  •   OscarRyz    15 年前

    HOUR_OF_DAY 而不是 HOUR

    import java.util.Calendar;
    import static java.util.Calendar.HOUR_OF_DAY;
    import static java.util.Calendar.MINUTE;
    import static java.util.Calendar.SECOND;
    import static java.util.Calendar.MILLISECOND;
    
    public class Today { 
        public static void main( String [] args ) { 
            Calendar cal = Calendar.getInstance();
            cal.set( HOUR_OF_DAY, 0 );
            cal.set( MINUTE, 0 );
            cal.set( SECOND, 0 );
            cal.set( MILLISECOND, 0 );
            System.out.println( cal.getTime() );
        }
    }
    

    您得到的结果是由于小时用于上午/下午,而每天的小时是24小时。

    一天中的小时数:

    get和set的字段号,指示一天中的小时数。24小时时钟使用一天中的小时。例如,在晚上10:04:15.250,一天的时间是22点。

    get和set的字段号,指示上午或下午的时间。小时用于12小时时钟(0-11)。中午和午夜由0表示,而不是由12表示。例如,在晚上10:04:15.250,时间是10点。

        4
  •  9
  •   Michael Borgwardt    15 年前

    时间组件不仅仅是小时(正如您所注意到的,Calendar.HOUR是AM/PM)。 你需要设置 全部的 时间字段的值为0:HOUR\u of_DAY,MINUTE,SECOND,millis秒。

        5
  •  4
  •   Steve K    15 年前

    Apache's commons-lang DateUtils.truncate()

        6
  •  2
  •   Arvind Kumar Avinash    3 年前

    java.time

    这个 java.util SimpleDateFormat 过时且容易出错。建议完全停止使用,并切换到 modern Date-Time API *

    home page of Joda-Time :

    注意,从JavaSE8开始,用户被要求迁移到Java.time(JSR-310)——JDK的核心部分,它取代了这个项目。

    java.time ,现代日期时间API:

    现代的日期时间API many types 真正代表特定时区中的日期、时间或日期时间。根据您的具体要求,您可以选择以下选项:

    1. a date without a timezone ,你可以使用 LocalDate.now . 好消息是它的变种, LocalDate#now(ZoneId)
    2. 如果您正在查找表示没有时区的日期的对象,并且时间单位设置为零,则可以调用 LocalDate#atStartOfDay 关于使用
    3. 如果您正在寻找 Instant 选项2 ,您可以使用 ZoneId.of("Etc/UTC") 使用 LocalDateTime#atZone 获得 ZonedDateTime 瞬间 使用 ZonedDateTime#toInstant .

    演示:

    import java.time.Instant;
    import java.time.LocalDate;
    import java.time.LocalDateTime;
    import java.time.ZoneId;
    import java.time.ZonedDateTime;
    
    public class Main {
        public static void main(String[] args) {
            LocalDate todayInSystemTz = LocalDate.now();
            System.out.println(todayInSystemTz);
    
            LocalDate todayInIndia = LocalDate.now(ZoneId.of("Asia/Kolkata"));
            System.out.println(todayInIndia);
    
            LocalDateTime todayInSystemTzWithZeroTimeUnits = todayInSystemTz.atStartOfDay();
            System.out.println(todayInSystemTzWithZeroTimeUnits);
    
            ZonedDateTime todayInUtcWithZeroTimeUnits = todayInSystemTzWithZeroTimeUnits.atZone(ZoneId.of("Etc/UTC"));
            System.out.println(todayInUtcWithZeroTimeUnits);
    
            Instant instant = todayInUtcWithZeroTimeUnits.toInstant();
            System.out.println(instant);
    
            // Can I represent the obtained Instant in India?
            System.out.println(instant.atZone(ZoneId.of("Asia/Kolkata")));
    
            // Can I represent the obtained Instant in New York?
            System.out.println(instant.atZone(ZoneId.of("America/New_York")));
        }
    }
    

    2021-06-20
    2021-06-20
    2021-06-20T00:00
    2021-06-20T00:00Z[Etc/UTC]
    2021-06-20T00:00:00Z
    2021-06-20T05:30+05:30[Asia/Kolkata]
    2021-06-19T20:00-04:00[America/New_York]
    

    ONLINE DEMO

    这个 Z 在输出中是 timezone designator 对于零时区偏移。它代表Zulu并指定 Etc/UTC 时区(其时区偏移为 +00:00

    无论出于何种原因,如果您需要转换 瞬间 java.util.Date ** ,您可以按如下操作:

    Date date = Date.from(instant);
    

    从中了解有关现代日期时间API的更多信息 Trail: Date Time .


    *出于任何原因,如果您必须坚持使用Java6或Java7,您可以使用 ThreeTen-Backport 哪个后端端口的大部分 Java 6的功能&7.如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请检查 Java 8+ APIs available through desugaring How to use ThreeTenABP in Android Project .

    A. 日期类型 对象仅表示 由于标准基准时间称为“历元”,即1970年1月1日00:00:00 GMT(或UTC)。由于它不保存任何时区信息,因此 toString 函数应用JVM的时区以返回 String 在格式上,, EEE MMM dd HH:mm:ss zzz yyyy 毫秒 价值得到 一串 日期类型 对象具有不同的格式和时区,您需要使用 具有所需格式和适用时区,例如。

    Date date = new Date();
    
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX", Locale.ENGLISH);
    
    sdf.setTimeZone(TimeZone.getTimeZone("America/New_York"));
    String strDateNewYork = sdf.format(date);
    
    sdf.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
    String strDateUtc = sdf.format(date);
    
        7
  •  1
  •   Clinton    15 年前

    Calendar.HOUR_OF_DAY
    

    相对于

    Calendar.HOUR
    

    您还需要清除其他字段( Calendar.MINUTE Calendar.SECOND Calendar.MILLISECOND )通过将它们设置为零。

        8
  •  1
  •   stenix Khalil    14 年前

    long MS_PER_DAY = 86400000L;
    Date dateTime=new Date();
    long offset = TimeZone.getDefault().getOffset(dateTime.getTime());
    Date date= new Date(((dateTime.getTime()+offset)/MS_PER_DAY)*MS_PER_DAY-offset);
    
        9
  •  1
  •   zorman2000    11 年前

    我知道这是一个非常古老的问题,不再活跃,但当我搜索谷歌时,它成为了最热门的问题。

    虽然所有的建议都很好,但我不敢相信没有人会简单地回答:

    Date date = new Date(System.currentTimeMillis());
    System.out.println(date);
    

    有效返回,今天的日期。

        10
  •  0
  •   Kurley    15 年前

    为什么要进行字符串操作?

    在使用getTime()转换为日期之前,是否可以在Calendar对象上设置所需的值?

        11
  •  0
  •   Charlie Charlie    15 年前

    再次投票给JodaTime。

    Date和Calendar太糟糕了,它们都坏了。(SimpleDataFormat也是垃圾!)

    值得一提的是,Java7将包括一个新的基于JodaTime的日期时间库。