【问题标题】:Java String to Date Conversion in different format不同格式的Java字符串到日期转换
【发布时间】:2012-04-20 14:14:28
【问题描述】:

所以我有String trDate="20120106"; 并想获得Date trDate=2012-01-06 并尝试使用SimpleDateFormat 来更改模式,但首先我获得parse 字符串然后生成日期然后尝试调用format这给了我回字符串,但我需要日期,任何建议,这是我的代码:

String trDate="20120106";    
Date tradeDate = new SimpleDateFormat("yyyymmdd", Locale.ENGLISH).parse(trDate);
String krwtrDate = new SimpleDateFormat("yyyy-mm-dd", Locale.ENGLISH).format(tradeDate);
Date krwTradeDate = new SimpleDateFormat("yyyy-mm-dd", Locale.ENGLISH).parse(krwtrDate);

这里是similar question,但它没有回答我的问题

我只需要在Date format 中转换字符串,因为我需要将它传递给另一个只需要Date object 的函数。

如果有人可以举例说明如何从stringyyyymmdd 格式)获取yyyy-mm-dd 格式的date,我将不胜感激?

【问题讨论】:

  • Date 对象没有格式。您可以使用它来转换为任何格式的字符串。
  • @adarshr: 你能给我一个例子,说明如何从stringyyyymmdd 格式)以yyyy-mm-dd 格式获取date
  • 你能显示其他函数的签名吗?如果是 void doSomethingWithDate(Date someDate) 之类的,相信我,没问题的。
  • 那你需要在inside那个方法里面做这个。您必须将传入的Date 对象转换为String 并传递给soap 调用。我假设您已经知道如何将Date 转换为String
  • 没有。你在那里做String krwtrDate = new SimpleDateFormat("yyyy-mm-dd", Locale.ENGLISH).format(someDate);

标签: java string date formatting


【解决方案1】:

--- 由于评论更新了答案---

好的,所以您使用的 API 需要一个字符串,它表示格式为2012-04-20 的日期

然后您需要解析格式不正确的Date,然后将其重新格式化为所需的格式。

String trDate="20120106";    
Date tradeDate = new SimpleDateFormat("yyyyMMdd", Locale.ENGLISH).parse(trDate);
String krwtrDate = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH).format(tradeDate);

还请注意,我更改了您的“月份”指示符,因为您在使用m 表示月份时犯了一个非常常见的错误。由于“小时:分钟:秒”日期格式有两个共同的“名称”,它们都以m 开头,分钟和月份。因此,大写 M 用于几个月,而小写 m 用于分钟。我敢打赌,这是您遇到问题的真正原因。

--- 原帖如下---

如果您的 API 需要 java.util.Date,那么您不需要做那么多。你实际上只有两行 java.util.Date

String trDate="20120106";    
Date tradeDate = new SimpleDateFormat("yyyymmdd", Locale.ENGLISH).parse(trDate);

但是如果不快速回顾一下java.util.Dates 是什么,这个解决方案可能就没有意义了。 Dates 是事物,但它们的呈现方式与它们的本质是分开的。

在任何时刻,都有一个 Date 实例描述该时刻。 Date 实例应该如何呈现并不一致,这在很大程度上取决于观众说什么语言,他们在哪个国家,这个国家实施了什么规则(夏令时),以及他们之前的文化背景做了什么.

因此,Date 没有单个关联的表示。这就是为什么不推荐使用Date 上的每个“获取 X”方法(其中 X 是日、月、小时、年等),除了从 0 日期(称为纪元)获取毫秒数。

因此,对于要正确呈现的每个 Date,您需要使用特定于语言、国家/地区、时区和文化先例的规则将其转换为 String。理解这些规则并应用它们的对象是DateFormat

这意味着,一旦您获得Date,您就不需要重新格式化它并重新解析它以获得“正确的”Date,因为这两个日期应该是相同的(对于相同的语言环境)。

【讨论】:

  • 我同意你的看法,但问题是 soap api 调用预计日期为 yyyy-mm-dd 格式,而我的字符串格式为 yyyymmdd 格式,所以我想先将 yyyymmdd 转换为 @987654346 @ 格式化字符串,然后使用 SimpleFormat parse 方法将此字符串转换为日期对象,但现在我不认为这是一个可行的选择。
  • @Rachel 只需将yyyymmdd 转换为Date 并传递给您的方法。暂时不要进行任何转换。进入方法后,将Date 转换回您想要的格式Stringyyyy-mm-dd
  • 在这种情况下,你不需要传入Date,你需要传入String。我会更新答案(因为这些注释框不是粘贴代码的最佳位置)。
  • @EdwinBuck:API 不需要string,但它需要date 对象
  • @Rachel 该帖子已更新,因为Dates 代表一个时刻(精确到毫秒),m 可能表示分钟或月。模棱两可的格式是不可取的,因此 Java 的 DateFormatm 定义为分钟,M 定义为月。我敢打赌这就是你没有得到预期输出的原因(因为你的格式是“年-分钟-天”)
【解决方案2】:

我明白了吗?

您有一个只接受 Date 作为参数的方法,并且在内部该方法使用 toString() 将 Date 转换为格式错误的字符串?

最好的方法是修改该方法并将 toString() 的使用与 SimpleDateFormat.format() 交换。

如果你不能修改那个方法,那么你可以用 OO “作弊”,即。 e.用您自己的实现替换 toString 方法,例如:

public class MyDate {
   private static final FMT = SimpleDateFormat("yyyy-mm-dd", Locale.ENGLISH);

   MyDate(long time) {
      super(time);
   }

   String toString() {
      return FMT.format(this);
   }
}

然后你调用你的方法

xxx = myMethod(new MyDate(new SimpleDateFormat("yyyymmdd", Locale.ENGLISH).parse(trDate).getTime()));

但是如果该方法内部没有使用 toString 而是使用了错误格式的 SimpleDateFormat,那么我的提议就行不通了。

【讨论】:

    【解决方案3】:

    你能给我一个例子,说明如何从yyyymmdd 格式的字符串中获取yyyy-mm-dd 格式的日期

    Date 对象没有与之关联的格式。在内部,它通常只存储一个 long 值。

    如果其他方法负责打印日期,那么很遗憾,您无法控制结果输出的格式。

    【讨论】:

      【解决方案4】:

      如果字符串日期始终采用您提到的格式,则可以使用 subString 方法提取年、月和日。

      字符串 trDate="20120106";

      使用String的subString方法提取年月日

      字符串年份 = "2012";
      字符串月份 = "01";
      String day = "06";

      并将这些解析为整数。假设您将字符串解析为整数

      int intYear = 2012;
      int intMonth = 01;
      int intDay = 06;

      Calendar calendar=new GregorianCalendar(intYear, intMonth - 1, intDay);

      日期 date = new Date(日历);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-01
        • 1970-01-01
        相关资源
        最近更新 更多