如何从java中的字符串时间戳中提取日期和时间

Posted

技术标签:

【中文标题】如何从java中的字符串时间戳中提取日期和时间【英文标题】:How to extract date and time from a String Timestamp in 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”。 【参考方案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 Oracle。 java.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 类已替换为 Instantjava.sql.Date 类已替换为 LocalDatejava.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 类?

Java SE 8Java SE 9Java SE 10 及更高版本 内置。 标准 Java API 的一部分,带有捆绑实现。 Java 9 添加了一些小功能和修复。 Java SE 6Java SE 7 大部分 java.time 功能都在ThreeTen-Backport 中向后移植到 Java 6 和 7。 Android 更高版本的 Android 捆绑包实现 java.time 类。 对于早期的 Android (ThreeTenABP 项目采用 ThreeTen-Backport(如上所述)。见How to use ThreeTenABP…

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

【讨论】:

以上是关于如何从java中的字符串时间戳中提取日期和时间的主要内容,如果未能解决你的问题,请参考以下文章

如何从R中具有月份名称的时间戳中提取日期

如何在sequelize ORM中使用从时间戳中选择并提取日期到月份和年份?

如何从Django中的时间戳中仅提取一天

pandas:从时间戳中提取日期和时间

pandas:从时间戳中提取日期和时间

从长的复杂日期加上时间戳中提取日期?