Java 将字符串转换为带时区的日期
我有一个模式为yyyy MM dd hh:MM a的字符串 我可以分别得到时区对象,上面的字符串表示日期 我想将其转换为以下格式。 yyyy MM dd HH:MM:ss Z 我如何才能做到这一点?使用 创建一个使用日期模式的新实例。之后,您可以调用它的parse方法将日期字符串转换为java.util.date对象。您可以使用Java 将字符串转换为带时区的日期,java,date,timezone,format,Java,Date,Timezone,Format,我有一个模式为yyyy MM dd hh:MM a的字符串 我可以分别得到时区对象,上面的字符串表示日期 我想将其转换为以下格式。 yyyy MM dd HH:MM:ss Z 我如何才能做到这一点?使用 创建一个使用日期模式的新实例。之后,您可以调用它的parse方法将日期字符串转换为java.util.date对象。您可以使用yyyy-MM-dd HH:MM:ss并显式设置: 打印出: 2010-11-17 13:12:00+0100 2010-11-17 20:12:00+0100 更新20
yyyy-MM-dd HH:MM:ss
并显式设置:
打印出:
2010-11-17 13:12:00+0100
2010-11-17 20:12:00+0100
更新2010-12-01:
如果要显式打印出特殊时区,请在SimpleDataFormat中进行设置:
sdf.setTimeZone(TimeZone .getTimeZone("IST"));
System.out.println(sdf.format(getSomeDate(
"2010-11-17 01:12 pm", TimeZone.getTimeZone("IST"))));
打印
2010-11-17 13:12:00+0530
毫无疑问,通常使用的格式将是2014-10-05T15:23:01Z
(TZ)
为此,必须使用此代码
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
String dateInString = "2014-10-05T15:23:01Z";
try {
Date date = formatter.parse(dateInString.replaceAll("Z$", "+0000"));
System.out.println(date);
} catch (ParseException e) {
e.printStackTrace();
}
其输出将为2014年10月5日星期日20:53:01 IST
但是,我不知道如果不添加replaceAll,为什么我们必须替换所有的“Z”,所有程序都将失败。tl;博士
避免遗留日期时间类
其他答案使用了麻烦的旧日期时间类(date
,Calendar
,等等),现在是遗留的,被java.time类取代
LocalDateTime
我有一个模式为yyyy MM dd hh:MM a的字符串
这样的输入字符串没有任何与UTC或时区的偏移指示。因此,我们将解析为一个
定义格式化模式,使输入与对象匹配
ldt.toString():2017-01-23T12:34
请注意,LocalDateTime
不是一个特定的时刻,只是一个关于一系列可能时刻的模糊概念。例如,巴黎午夜过后几分钟,法国的蒙特勒阿尔加拿大仍然是“昨天”。因此,如果没有诸如或之类的时区上下文,仅仅说“午夜后几分钟”没有任何意义
ZoneId
我可以分别得到时区对象,上面的字符串表示日期
时区由类表示
以大陆/地区
的格式指定,例如,或太平洋/奥克兰
。切勿使用3-4个字母的缩写,如EST
或IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)
ZoneDateTime
应用ZoneId
获取一个时间轴上的一个点,即历史上的一个特定时刻
ZonedDateTime zdt = ldt.atZone( z );
zdt.toString():2017-01-23T12:34-05:00[美国/蒙特利尔]
Instant
我想将其转换为以下格式。yyyy MM dd HH:MM:ss Z
首先,知道Z
文字字符是Zulu
的缩写,意思是。换句话说,一个零小时的时间,+00:00
该类表示时间线上的一个时刻,分辨率为(小数点的九(9)位)
您可以从ZoneDateTime
中提取Instant
对象
Instant instant = zdt.toInstant(); // Extracting the same moment but in UTC.
要生成标准格式的字符串,如2017-01-22T18:21:13.354Z
,请调用toString
。标准格式没有空格,使用T
将年-月日期与小时-分-秒分隔开来,并将Z
标准地附加在偏移量为零的位置
String output = instant.toString();
instant.toString():2017-01-23T17:34:00Z
我强烈建议尽可能使用标准格式。如果您坚持按所述的所需格式使用空格,可以在对象中定义自己的格式模式,或者只对对象的输出执行字符串操作
输出:2017-01-2317:34:00Z
试试这个
关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,& 该项目现已启动,建议迁移到类 要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是 从哪里获得java.time类
- 后来
- 内置的李>
- 标准JavaAPI的一部分,带有捆绑实现
- Java9添加了一些次要功能和修复
- 及
- 大部分java.time功能都在中向后移植到Java6和Java7
-
- 该项目专门为Android采用了ThreeTen Backport(如上所述)
- 看
该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可能会在这里找到一些有用的类,如、、和。使java中的所有日期操作变得非常有用easier@Emil在您说:)之后,我了解了这个特性。谢谢。仅供参考,项目现在开始了,团队建议迁移到类。有时getID()会返回类似“America/Argentina/Ushuaia”的字符串。那我怎么用呢it@MichaelKonietzka@shal我快点我错过了,更新了answer@MichaelKonietzka您现在就在您的位置,但情况并非如此谢谢Michael先生,日期和时间会随着时区的变化而变化。记下+100,它不会改变时区offset@shal:对不起,我听不懂你的第二句话。你认为有什么不对劲吗?@Michael,我是说时间被正确地转换了,但是看到打印在“+0100”上的日期值中的“Z”部分没有变化。例如,如果我将日期从GMT转换为IST,那么转换日期的“Z”部分必须是“+0530”。这取决于代码运行的系统。对于
IST
,它在ideone.FYI上打印出2010-11-17 07:42:00+0000
,旧的和类现在是。被类取代。只需在答案中的replaceAll()注释上做一个注释。replace()使用字符串文字,其中as replaceAll()或replaceFirst()支持
String input = "2017-01-23 12:34 PM" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd hh:mm a" );
LocalDateTime ldt = LocalDateTime.parse( input , f );
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ldt.atZone( z );
Instant instant = zdt.toInstant(); // Extracting the same moment but in UTC.
String output = instant.toString();
String output = instant.toString()
.replace( "T" , " " ) // Substitute SPACE for T.
.replace( "Z" , " Z" ); // Insert SPACE before Z.