【问题标题】:How to extract date and time from a String Timestamp in java如何从java中的字符串时间戳中提取日期和时间
【发布时间】:2014-03-14 19:49:03
【问题描述】:

我从 MySQL 以这种格式从服务器获取日期和时间为 String TIMESTAMP

2014-02-15 05:18:08

我想要的是提取DD-MM-YYYY 格式的日期和HH:MM:SS AM/PM 格式的时间。这个时间戳的时区也不同,我想要它在印度时区(IST)。

记住timestampString 数据类型。

【问题讨论】:

  • 使用SimpleDateFormat 实例进行解析。
  • 顺便说一下,避免使用 3 个字母的时区代码。它们既不是标准化的,也不是唯一的。您对IST 的使用可以表示“爱尔兰标准时间”以及“印度标准时间”。请改用proper time zone name,例如“Asia/Kolkata”。

标签: java mysql date datetime


【解决方案1】:

您可以使用 DATE_FORMAT(date,format)。

在你的情况下,它会是这样的:

SELECT DATE_FORMAT(timestamp, '%e-%c-%Y') FROM table WHERE...

-edit:上面的代码会将您的时间戳返回为:“DD-MM-YYYY”。

时间戳是您的 mySQL 字段(换句话说:列)。

对于其他格式选项,我建议您快速浏览一下: DATE_FORMAT options

【讨论】:

    【解决方案2】:

    使用 SimpleDateFormat,例如:-

    String s = new java.text.SimpleDateFormat("dd-MM-yyyy HH:mm:ss").format(yourTimestamp);
    

    更多信息 SimpleDateFormat.

    【讨论】:

      【解决方案3】:

      使用java.text.SimpleDateFormatjava.util.TimeZone

      日期字符串在哪个时区?将以下UTC 时区替换为该时区

      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
      sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
      Date date = sdf.parse("2014-02-15 05:18:08");
      
      SimpleDateFormat sdf2 = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss a");
      sdf2.setTimeZone(TimeZone.getTimeZone("IST"));
      String dateStr = sdf2.format(date); // Output: 15-02-2014 10:48:08 AM
      

      注意:您的输入字符串中小时的格式是(24 小时/12 小时)?上面的示例假定它是 24 小时格式,因为输入字符串中没有 AM/PM 信息。

      如果输入字符串也是 12 小时格式,那么您的输入字符串也应提及 AM/PM 信息,例如 2014-02-15 05:18:08 PM。在这种情况下,将sdf 修改为new SimpleDateFormat("yyyy-MM-dd hh:mm:ss a")

      ========================= 已编辑: ======================

      在评论“如何分别提取日期和时间”中回答您的下一个问题...

      SimpleDateFormat sdfDate = new SimpleDateFormat("dd-MM-yyyy");
      sdfDate.setTimeZone(java.util.TimeZone.getTimeZone("IST"));
      
      SimpleDateFormat sdfTime = new SimpleDateFormat("hh:mm:ss a");
      sdfTime.setTimeZone(java.util.TimeZone.getTimeZone("IST"));
      
      String dateStr = sdfDate.format(date);
      String timeStr = sdfTime.format(date);
      

      【讨论】:

      • 感谢 Yatendra 的帮助。它完美无缺。我实际上是java新手。您能告诉我如何将日期和时间单独提取为字符串吗?实际上我正在为 android 编程,我想在它自己的文本视图中显示日期和时间。
      • 好吧,我自己想通了,只是改变了格式字符串。谢谢大佬,对我帮助很大。谢谢!
      【解决方案4】:

      接受的answer by Yatendra Goel 是正确的。

      乔达时间

      为了好玩,下面是使用Joda-Time 2.3 库的相同类型的代码。

      请注意,Joda-Time 现在位于 maintenance mode 中。团队建议迁移到 java.time。 java.time 代码见my other Answer

      仅供参考……印度比UTC/GMT 早五个小时。因此下面的输出有 30 分钟的差异。

      String input = "2014-02-15 05:18:08";
      input = input.replace( " ", "T" ); // Replace space in middle with a "T" to get ISO 8601 format.
      
      // Parse input as DateTime in UTC/GMT.
      DateTime dateTimeUtc = new DateTime( input, DateTimeZone.UTC );
      // Adjust to India time.
      DateTimeZone timeZone = DateTimeZone.forID( "Asia/Kolkata" );
      DateTime dateTime = dateTimeUtc.withZone( timeZone );
      
      // Using "en" for English here because (a) it is irrelevant in our case, and (b) I don't know any Indian language codes.
      java.util.Locale localeIndiaEnglish = new Locale( "en", "IN" ); // ( language code, country code );
      DateTimeFormatter formatter = DateTimeFormat.forStyle( "SS" ).withLocale( localeIndiaEnglish ).withZone( timeZone );
      String output = formatter.print( dateTime );
      
      DateTimeFormatter formatterDateOnly = DateTimeFormat.forPattern( "dd-MM-yyyy" ).withLocale( localeIndiaEnglish ).withZone( timeZone );
      DateTimeFormatter formatterTimeOnly = DateTimeFormat.forPattern( "hh:mm:ss a" ).withLocale( localeIndiaEnglish ).withZone( timeZone );
      String dateOnly = formatterDateOnly.print( dateTime );
      String timeOnly = formatterTimeOnly.print( dateTime );
      

      转储到控制台...

      System.out.println( "input: " + input );
      System.out.println( "dateTimeUtc: " + dateTimeUtc );
      System.out.println( "dateTime: " + dateTime );
      System.out.println( "output: " + output );
      System.out.println( "dateOnly: " + dateOnly );
      System.out.println( "timeOnly: " + timeOnly );
      

      运行时……

      input: 2014-02-15T05:18:08
      dateTimeUtc: 2014-02-15T05:18:08.000Z
      dateTime: 2014-02-15T10:48:08.000+05:30
      output: 15/2/14 10:48 AM
      dateOnly: 15-02-2014
      timeOnly: 10:48:08 AM
      

      【讨论】:

      • @RafiAbro 很高兴为您提供帮助。但请注意,Joda-Time 项目现在位于maintenance mode,团队建议迁移到java.time 类。见Tutorial by Oraclejava.time 参见my other Answer
      • 哦,我使用了 joda-Time 的那些应用程序会发生什么..
      • @RafiAbro Joda-Time 继续积极维护,并通过捆绑tzdata 对其进行错误修复和更新。但没有进一步开发功能。方便时,您应该修改您的应用程序以使用 java.time 类。但不紧急。过渡相当容易,因为这两个项目拥有相同的概念和相同的领导者 Stephen Colebourne。
      【解决方案5】:

      tl;博士

      ZonedDateTime zdt = LocalDateTime.parse( "2014-02-15 05:18:08".replace( " " , "T" ) ).atOffset( ZoneOffset.UTC ).atZoneSameInstant( ZoneId.of( "Asia/Kolkata" ) ) ;
      LocalDate ld = zdt.toLocalDate();
      LocalTime lt = zdt.toLocalTime();
      

      使用对象,而不是字符串

      您应该从数据库中检索日期时间值作为日期时间对象而不是字符串。

      从 JDBC 4.2 及更高版本开始,我们可以与数据库交换 java.time 对象。

      Instant instant = Instant.now() ;  // Capture the current moment in UTC.
      myPreparedStatement.setObject( … , instant ) ;
      

      检索。

      Instant instant = myResultSet.getObject( … , Instant.class ) ;
      

      java.time

      Java 8 和更高版本中的 java.time 类取代了麻烦的旧旧日期时间类以及第 3 方 Joda-Time 库。

      • java.sql.Timestamp 类已替换为 Instant
      • java.sql.Date 类已替换为 LocalDate
      • java.sql.Time 类已替换为 LocalTime
      • -

      解析字符串

      如果您遇到这样的字符串,请使用 java.time 类对其进行解析。其他答案正在使用与 Java 的最早版本捆绑在一起的麻烦的旧日期时间类。这些现在是遗留问题,应该避免。

      您的输入字符串几乎是标准的ISO 8601 格式。只需将中间的空格替换为T

      String input = "2014-02-15 05:18:08".replace( " " , "T" ) ;
      

      LocalDateTime

      解析为LocalDateTime,因为字符串缺少有关offset-from-UTC 或时区的任何信息。

      LocalDateTime ldt = LocalDateTime.parse( input ) ;
      

      OffsetDateTime

      我会假设您输入字符串中的值是UTC 时区中的一个时刻。所以调整为UTC。

      OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC ) ;
      

      ZonedDateTime

      您要求将此调整到比 UTC 时间提前五个半小时的 India time 区域。

      atZoneSameInstant 表示生成的ZonedDateTime 表示与OffsetDateTime 完全相同的同时时刻。两者的不同之处仅在于他们通过wall-clock time 的两个不同镜头观看同一时刻。

      ZoneId z = ZoneId.of( "Asia/Kolkata" );
      ZonedDateTime zdt = odt.atZoneSameInstant( z );
      

      LocalDate & LocalTime

      如果您想分别处理日期部分和时间部分,请将每个部分提取为 Local…

      LocalDate ld = zdt.toLocalDate();
      LocalTime lt = zdt.toLocalTime();
      

      生成字符串表示

      类上的toString 方法都使用标准ISO 8601 格式生成字符串表示。要使用其他格式,请使用 DateTimeFormatter 类。在 Stack Overflow 上搜索许多示例和讨论。

      最简单的方法是让课程自动为您本地化。为所需的人类语言和所需的文化规范指定 Locale,以决定大小写、缩写等问题。

      Locale locale = new Locale( "en" , "IN" ); // English language, India cultural norms.
      DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.SHORT ).withLocale( locale );
      String output = zdt.format( f );
      

      关于java.time

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

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

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

      您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。

      从哪里获得 java.time 类?

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-01
        • 1970-01-01
        • 2020-08-14
        • 2015-12-28
        • 2018-07-18
        相关资源
        最近更新 更多