有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

不同格式的Java字符串到日期的转换

所以我有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的函数

如果有人能举例说明如何从string格式的yyyymmdd中获取date格式的yyyy-mm-dd,我将不胜感激


共 (4) 个答案

  1. # 1 楼答案

    can you give me an example of how to get date in yyyy-mm-dd format from string which is in yyyymmdd format

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

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

  2. # 2 楼答案

    我理解得好吗

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

    最好是修改该方法,并将toString()的用法与SimpleDataFormat交换。格式()

    如果你不能修改这个方法,那么你可以用OO“作弊”,也就是用你自己的实现替换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,而是使用错误格式的SimpleDataFormat,那么我的建议就行不通

  3. # 3 楼答案

    如果字符串日期总是以您提到的格式出现,那么可以使用子字符串方法提取年、月和日

    String trDate="20120106";

    使用字符串的子字符串方法提取年、月和日

    String year = "2012";
    String month = "01";
    String day = "06";

    并将其解析为整数。假设您要将字符串解析为整数

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

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

    Date date = new Date(calendar);

  4. # 4 楼答案

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

    好的,所以您使用的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.Date是什么,这个解决方案可能就没有意义Dates是事物,但它们的呈现方式与它们的本来面目脱节

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

    因此,Date没有单一的关联表示。这就是为什么Date上的每个“get the X”方法都被弃用的原因(其中X是日、月、小时、年等),除了从0日期(称为历元)获取毫秒之外

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

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