Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将字符串转换为带时区的日期_Java_Date_Timezone_Format - Fatal编程技术网

Java 将字符串转换为带时区的日期

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 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

更新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.