【问题标题】:How do I create the java date object without time stamp [duplicate]如何创建没有时间戳的java日期对象[重复]
【发布时间】:2014-05-23 05:46:28
【问题描述】:

我想创建一个没有 TimeZone 的 Date 对象(例如:2007-06-21)。这可能吗?

当我使用以下方法时,它会打印为 Thu Jun 21 00:00:00 GMT 2007

SimpleDateFormat  sdf       = new SimpleDateFormat("yyyy-MM-dd");

TimeZone          timeZone  = TimeZone.getTimeZone("GMT");
timeZone.setDefault(timeZone);
sdf.setTimeZone(timeZone);

Date              pickUpDate = sdf.parse("2007-06-21");
System.out.println(pickUpDate);

【问题讨论】:

标签: java date timezone simpledateformat


【解决方案1】:

如果你想格式化一个日期,你需要使用DateFormat或类似的东西。 Date 只是一个瞬间 - 自 Unix 纪元以来的毫秒数。它不知道时区、日历系统或格式。 toString() 方法始终使用系统本地时区,并始终以默认方式对其进行格式化。来自documentation

将此日期对象转换为以下形式的字符串:

dow mon dd hh:mm:ss zzz yyyy

所以它的行为与记录的完全一样。

你已经有了一个格式正确的DateFormat,所以你只需要调用format就可以了:

System.out.println("pickUpDate" + sdf.format(pickUpDate));

当然,它在您的示例中没有多大意义,因为您只是解析它 - 但大概您通常会先传递日期。

请注意,如果这是为了与数据库交互,最好不要将其作为字符串传递。尽可能多地将值保持在“本机”表示中,并使用 PreparedStatement.setDate 之类的东西将其传递给数据库。

顺便说一句,如果您可以可能更改为使用 Joda Time 或 Java 8 中的新日期/时间 API (java.time.*),您将拥有更顺畅的时间任何与日期/时间相关的东西。 Date/Calendar API 真的很可怕。

【讨论】:

    【解决方案2】:

    这是java.util.Date 中的toString()

        public String toString() {
    
            // "EEE MMM dd HH:mm:ss zzz yyyy";
            BaseCalendar.Date date = normalize();
    
            StringBuilder sb = new StringBuilder(28);
            int index = date.getDayOfWeek();
            if (index == gcal.SUNDAY) {
                index = 8;
            }
    
            convertToAbbr(sb, wtb[index]).append(' ');            // EEE
            convertToAbbr(sb, wtb[date.getMonth() - 1 + 2 + 7]).append(' ');  // MMM
            CalendarUtils.sprintf0d(sb, date.getDayOfMonth(), 2).append(' '); // dd
    
            CalendarUtils.sprintf0d(sb, date.getHours(), 2).append(':');   // HH
            CalendarUtils.sprintf0d(sb, date.getMinutes(), 2).append(':'); // mm
            CalendarUtils.sprintf0d(sb, date.getSeconds(), 2).append(' '); // ss
    
            TimeZone zi = date.getZone();
            if (zi != null) {
                sb.append(zi.getDisplayName(date.isDaylightTime(), zi.SHORT, Locale.US)); // zzz
            } else {
                sb.append("GMT");
            }
    
            sb.append(' ').append(date.getYear());  // yyyy
    
            return sb.toString();
        }
    

    因此,如果您将传递一个日期并尝试打印它,它将一直打印出来。

    【讨论】:

      【解决方案3】:

      代码:

      Date date = new Date();     
      System.out.println(new SimpleDateFormat("yyyy-MM-dd").format(date));
      

      日期:Fri Apr 29 04:53:16 GMT 2016

      样本输出:2016-04-29

      需要进口:

      import java.util.Date; //for new Date()
      import java.text.SimpleDateFormat; // for the format change
      

      【讨论】:

        【解决方案4】:
        System.out.println("pickUpDate " + sdf.format(pickUpDate));
        

        您可以使用上面的代码将Date格式化为String

        【讨论】:

          【解决方案5】:

          使用此代码:

          SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");
          Date pickUpDate =sdf.parse("2007-06-21");
          System.out.println("pickUpDate "+sdf.format(pickUpDate));
          

          希望对你有帮助。

          【讨论】:

            【解决方案6】:
             String your_format_date=sdf.format(pickUpDate);
             System.out.println("pick Up Date " + your_format_date);
            

            【讨论】:

              【解决方案7】:

              Date 不是日期。这是一个时间戳。这是一些令人印象深刻的 API 设计,不是吗?

              您现在需要的类型是 java.time.LocalDate,在 Java 8 中添加。

              如果您不能使用 Java 8,您可以使用 ThreeTen,这是 Java 7 的反向端口。

              【讨论】:

              • 尽管我同意 LocalDate 会更好,但现在假设每个人都可以使用 Java 8 还为时过早。
              • 更新了提到 Java 7 backport 的答案。
              猜你喜欢
              • 2010-11-01
              • 2021-01-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-02-26
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多