【问题标题】:Set date format and then convert it in Date from String- Java设置日期格式,然后将其从 String-Java 转换为 Date
【发布时间】:2013-08-02 00:54:05
【问题描述】:

我这样做是为了设置日期格式,然后将其转换为日期数据类型,但它没有给出预期的结果。

 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
 DateFormat formatter = new SimpleDateFormat("yyyy/MM/dd");
 String cur_date=dateFormat.format(new Date());
 myDb.setDOB(formatter.parse(cur_date));

场景是:我希望将当前日期转换为 yyyy/mm/dd,然后将其传递给 setDOB(Date date)。

编辑:添加结果结果是 2013 年 1 月 1 日星期二 00:08:00 IST

伙计们!我没有使用'mm',这里我只是在DateFormat中错误地写了mm,它也是MM

再次编辑首先我只使用了 setDOB(new Date() );但出现格式问题,

然后我使用 SimpleDateFormat.format 设置 yyyy/MM/dd 但它返回 String so used

DateFormat.parse 将其转换回日期类型。

【问题讨论】:

  • 它给出了什么结果?
  • 不确定为什么要转换日期 -> 字符串 -> 日期。为什么不首先使用日期?唯一的影响是您最终得到的日期的时间为 00:00,并且有更简单的方法可以实现这一点。
  • @Qwerky 你能告诉我如何从日期中删除时间吗?并且只获取 yyyy/MM/dd 格式的日期?
  • 如果你真的想去掉时间,看看Calendar类,它允许你设置小时和分钟。但是,正如其他人所回答的那样,最好将准确的日期存储在数据库中,然后在显示时对其进行格式化。
  • 不幸的是,数据库处理不在我的尽头,其他人正在处理它。

标签: java date type-conversion date-format simpledateformat


【解决方案1】:

您没有使用相同的格式。案件很重要! “MM”代表月份,“mm”代表分钟。

【讨论】:

  • 我不是,这里写错了'mm'
【解决方案2】:

问题是你的 MM 格式。

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
DateFormat formatter = new SimpleDateFormat("yyyy/mm/dd");
  • MM 是月份
  • 毫米是分钟

有关详细格式,请参阅here。应该是这样的,

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
DateFormat formatter = new SimpleDateFormat("yyyy/MM/dd");

【讨论】:

    【解决方案3】:

    +1 mael 用于首先发现格式问题,但是...

    Date 是自纪元(格林威治标准时间 1970 年 1 月 1 日 1 月 1 日)以来毫秒数的容器,它不关心值的格式。

    比如下面的……

    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
    DateFormat formatter = new SimpleDateFormat("yyyy/MM/dd");
    Date now = new Date();
    String cur_date = dateFormat.format(now);
    
    try {
        System.out.println("Now = " + now);
        System.out.println("cur_date = " + cur_date);
        System.out.println("dateFormat.parse(cur_date) = " + dateFormat.parse(cur_date));
    } catch (ParseException exp) {
        exp.printStackTrace();
    }
    

    输出...

    Now = Thu Aug 01 18:08:39 EST 2013
    cur_date = 2013/08/01
    dateFormat.parse(cur_date) = Thu Aug 01 00:00:00 EST 2013
    

    因此,您可能会丢失有关日期的重要数据...

    在你想显示值时保留格式,而不是在你想存储它时(如果你能侥幸的话)

    【讨论】:

    • +1 表示此解释。格式化日期 + 解析输出可能会丢失数据。
    【解决方案4】:

    听起来您希望Date“知道”它的格式。它没有。 Date 对象 just 包含自 Unix 纪元以来的毫秒数。它不知道时区、日历或字符串格式。这只是一个约会。

    所以你的代码应该是:

    myDb.setDOB(new Date());
    

    ...然后在您显示的任何地方处理它的格式。

    【讨论】:

    • 如果你看到我得到 new Date() 的代码,我会做同样的事情,但我想将其格式化为 yyyy/MM/dd 所以我使用简单的格式化程序,但它返回字符串,所以我必须使用 DateFormat.format 将其转换回日期......我还应该做什么?
    【解决方案5】:

    您正在使用不同的日期字符串模式。 MM 代表月,mm 代表分钟(请参阅SimpleDateFormat API)

    您的 setDOB 正在使用 Date 对象。我不明白为什么在将日期作为方法调用中的参数时可能要格式化日期。通常,当需要在某处呈现/存储日期时会格式化日期。

    【讨论】:

      【解决方案6】:

      formatter.parse 用于解析String Date,它返回Date Object。 日期表示为 Date 对象或自 1970 年 1 月 1 日 00:00:00 GMT 以来的毫秒数。 我没有得到你实际上在做什么。日期对象始终以上述格式表示。

      【讨论】:

        【解决方案7】:

        问题和其他答案都使用麻烦的旧日期时间类,这些类现在是遗留的,被 java.time 类所取代。

        LocalDate

        显然你想要一个仅限日期的值。

        LocalDate 类表示没有时间和时区的仅日期值。

        时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因区域而异。例如,Paris France 中午夜过后几分钟是新的一天,而 Montréal Québec 中仍然是“昨天”。

        以continent/region 的格式指定proper time zone name,例如America/Montreal、Africa/Casablanca 或Pacific/Auckland。切勿使用 3-4 个字母的缩写,例如 EST 或 IST,因为它们不是真正的时区,没有标准化,甚至不是唯一的 (!)。

        ZoneId z = ZoneId.of( "America/Montreal" );  // Or "Asia/Kolkata" , "Pacific/Auckland" , etc.
        LocalDate today = LocalDate.now( z );
        

        生成字符串

        要生成表示该LocalDate 值的字符串,只需调用toString()。该方法生成标准ISO 8601 格式的字符串。

        String output = today.toString();
        

        2017-01-23

        您想要的格式与此接近,使用斜线字符代替连字符。我建议尽可能坚持使用标准格式。但如果你坚持,只需替换字符即可。

        String output = today.toString().replace( "-" , "/" );
        

        对于其他格式,请使用 DateTimeFormatter 类。并注意该类在生成字符串时自动本地化的能力。


        关于java.time

        java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。

        Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

        要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。

        从哪里获得 java.time 类?

        ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-05-05
          • 2011-12-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-10
          • 2017-07-28
          相关资源
          最近更新 更多