如何从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)。
记住timestamp
是String
数据类型。
【问题讨论】:
使用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.SimpleDateFormat
和java.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
类已替换为 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.Date
、Calendar
和 SimpleDateFormat
。
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 8、Java SE 9、Java SE 10 及更高版本 内置。 标准 Java API 的一部分,带有捆绑实现。 Java 9 添加了一些小功能和修复。 Java SE 6 和 Java 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 的试验场。您可以在这里找到一些有用的类,例如Interval
、YearWeek
、YearQuarter
和more。
【讨论】:
以上是关于如何从java中的字符串时间戳中提取日期和时间的主要内容,如果未能解决你的问题,请参考以下文章