【问题标题】:converting a string date into US format in java在java中将字符串日期转换为美国格式
【发布时间】:2016-04-02 22:17:56
【问题描述】:

我有以下代码,其中日期为字符串类型,我必须将其设置为美国格式 所以下面我已经展示了它

private static final SimpleDateFormat usOutputDate =  new SimpleDateFormat("MM/dd/yyyy");

在一个方法中,我编写了以下代码,在dealDateString 中,值是02-Mar-2015

// dealDateString = 02-Mar-2015 
java.util.Date  dealDate = extractDate(dealDateString); 
//here its value get converted in US format that is 03/02/2015
String dd = usOutputDate.format(dealDate); 

DateFormat format = new SimpleDateFormat("MM/dd/yyyy", Locale.US); 
// ***issue comes here as it get back converted in US format ***
java.util.Date date =  format.parse(dd);
brokerInvoiceLineItem.setDealDate(new Date(date));

如上面的代码所示,String dd 中的值是03/02/2015,但问题在于格式变量 它的值以我不想要的英国格式转换回请告知我如何将其转换为英国格式 已转换为之前存储在 String dd 中的美国格式。

【问题讨论】:

  • :S 在你的情况下发生了什么。我们能说清楚点吗
  • 所以您想转换为美国格式或英国格式..please advise how can i convert it in UK format as it is already converted in US format previously stored inside string dd,但您的问题标题为converting a string date into US format in java?
  • 在格式内部,值是英国格式,即 02/03/2015 但它应该是美国格式,即应该是 03/02/2015 请告知我如何从这个里面的字符串 dd 它已经是 03/02/2015 的格式
  • @Hemang 是的,我很抱歉,但现在的问题是,在字符串 dd 内部,它是完美的,它是 03/02/2015 但是当我格式化它时,它是 DateFormat format = new SimpleDateFormat("MM /dd/yyyy", Locale.US);..这里面的问题是
  • 并且您想将其格式化回来,因为您希望它为Mar-02-2015

标签: java date date-formatting


【解决方案1】:

Silambarasan Poonguti 的 accepted Answer 和 Ramesh Ponnada 的 other Answer 都是正确的。但两者都过时了,使用与 Java 的最早版本捆绑在一起的旧日期时间类。这些课程已被证明是麻烦、混乱和有缺陷的。

java.time

java.time 框架内置在 Java 8 中,后来取代了旧的 java.util.Date/.Calendar 类。新类的灵感来自非常成功的Joda-Time 框架,该框架旨在作为其继任者,在概念上相似但经过重新架构。由JSR 310 定义。由ThreeTen-Extra 项目扩展。请参阅Oracle Tutorial

LocalDate

这些新类包括LocalDate,用于处理没有时间和时区的仅日期值。尽管 LocalDate 不包含时区,但请注意时区对于确定诸如“今天”之类的日期至关重要。世界各地的日期在任何时候都不相同,因为新的一天在东方更早地黎明。

LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) ) ;

解析字符串

要解析字符串,请指定编码模式。此模式类似于旧 java.text.SimpleTextFormat 中使用的模式,但不完全相同。所以请务必仔细研究java.time.format.DateTimeFormatter 文档。

请注意,我们使用三元组M 来指定我们期望日期名称的缩写。这是解决问题中问题的关键。

还请注意,我们指定了一个 Locale,它告诉 java.time 我们期望的人类语言用于该日期的缩写名称。

String input = "02-Mar-2015";
Locale locale = Locale.US;
DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "dd-MMM-yyyy" ).withLocale ( locale );
LocalDate localDate = LocalDate.parse ( input , formatter );

转储到控制台。默认情况下,java.time 中的toString 方法使用标准的ISO 8601 格式。

System.out.println ( "localDate: " + localDate );

本地日期:2015-03-02

生成字符串

在生成日期时间值的字符串表示时,通常最好让 java.time 为您本地化它,而不是假定特定格式。 java.time.format 包具有此类工作的类。

注意对withLocale 的调用。 Locale 指定了两个元素,预期格式的文化规范和用于日期和月份名称的人类语言。如果不指定 Locale,则隐式应用 JVM 当前的默认 Locale。最好是明确的,因为默认值可以随时更改。

DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate ( FormatStyle.SHORT ).withLocale ( Locale.US );
String output = today.format ( formatter );

转储到控制台。

System.out.println ( "output: " + output );

输出:2015 年 12 月 29 日

如果您坚持使用特定格式,请指定编码模式。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "MM/dd/yyyy" );
String output = today.format ( formatter );

输出:2015 年 12 月 29 日

转化

如果您手头有 java.util.Date,请转换为 java.time。 InstantUTC 时间线上的一个时刻。

Instant instant = myJUDate.toInstant();

指定您想要形成日期的时区,生成ZonedDateTime

ZoneId zoneId = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId ) ;

然后要求生成一个 LocalDate,它的值是从 ZonedDateTime 中提取的。

LocalDate localDate = zdt.toLocalDate();

【讨论】:

    【解决方案2】:

    你可以试试下面的代码:

    SimpleDateFormat ukDateFormat =  new SimpleDateFormat("dd-MMM-yyyy");
    SimpleDateFormat usDateFormat = new SimpleDateFormat("MMM-dd-yyyy", Locale.US);
    
    java.util.Date  dealDate = ukDateFormat.parse("02-Mar-2015");
    String dateInUSFormat = usDateFormat.format(dealDate);
    System.out.println(dd); // Here you have date String in US format.
    

    Link 有很多关于如何在 Java 中进行日期转换的示例

    【讨论】:

    • 真正的问题不是这个,正如您在字符串 dateInUSFormat 中看到的那样,您可以获得正确的值,即 03/02/2015 但如果您要添加此 DateFormat 格式 = new SimpleDateFormat,问题就来了(“MM/dd/yyyy”,Locale.US);之后
    • Naresh,您的问题不清楚,您能否更具体地说明再次应用格式时发生的情况。以及将哪一行转换回英国格式。你的代码没有显示我相信的后面部分
    • 当我在字符串 dd 上应用格式时,它再次转换为英国格式,这就是问题
    • 上面接受的答案给出了该特定时间的日期(UTC 未指定源 TZ)因此以这种方式转换 2015 年 2 月 3 日 00:00 时会给出 2015 年 2 月 2 日 20:00 时(取决于 DST)。这是你想要的吗?
    • 是的,现在你明白了,请告诉我如何达到同样的效果
    【解决方案3】:

    试试这个...

      try {
            //parsing date format
            SimpleDateFormat formatter = new SimpleDateFormat("dd-MMM-yyyy");
    
            String dealDateString = "02-Mar-2015";
            Date date = formatter.parse(dealDateString);
            TimeZone tz = TimeZone.getDefault();
    
            //converting date format for US
            SimpleDateFormat sdfAmerica = new SimpleDateFormat("MM/dd/yyyy");
            TimeZone tzInAmerica = TimeZone.getTimeZone("America/New_York");
            sdfAmerica.setTimeZone(tzInAmerica);
    
            String sDateInAmerica = sdfAmerica.format(date); // Convert to String first
            System.out.println("Date (String) : " + sDateInAmerica);
    
        } catch (Exception bug) {
            bug.printStackTrace();
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-28
      • 2015-12-17
      • 2014-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-14
      相关资源
      最近更新 更多