当我创建一个新Date
对象时,它会初始化为当前时间但在本地时区.如何获得GMT中的当前日期和时间?
什么是获得ISO 8601格式的当前时刻,UTC 的最优雅方式?它应该看起来像:2010-10-12T08:50Z
.
例:
String iso8601 = DateFormat.getDateTimeInstance(DateFormat.ISO_8601).format(date);
Run Code Online (Sandbox Code Playgroud) 我正在添加这个问题,因为我是Java和Android的新手,我搜索了几个小时试图解决这个问题.答案来自相关答案的组合,所以我想我会记录我为其他可能正在努力的人学到的东西.见答案.
对于一些背景知识,我的经验主要是PHP的Web开发和一点Ruby.我唯一的操作系统是Linux(Ubuntu Studio),我(不情愿地)在Android Studio 2.1.2中开发我的第一个Android应用程序.我的Java设置如下:
>java -version
> openjdk version "1.8.0_91"
> OpenJDK Runtime Environment (build 1.8.0_91-8u91-b14-3ubuntu1~15.10.1-b14)
> OpenJDK 64-Bit Server VM (build 25.91-b14, mixed mode)
Run Code Online (Sandbox Code Playgroud) datetime android android-gradle-plugin threetenbp threetenabp
我试图解析一个看起来像这样的日期:
yyyy-MM-dd'T'HH:mm:ss
Run Code Online (Sandbox Code Playgroud)
这是http://www.ietf.org/rfc/rfc3339.txt的有效日期."Z"字面意思"暗示UTC是指定时间内的首选参考点."
如果我尝试使用SimpleDateFormat和此模式解析它:
yyyy-MM-dd'T'HH:mm:ssz
yyyy-MM-dd'T'HH:mm:ssZ
Run Code Online (Sandbox Code Playgroud)
它将被解析为2010年4月5日17:16:00美国东部时间2010年
SimpleDateFormat无法使用以下模式解析字符串:
yyyy-MM-dd'T'HH:mm:ss
Run Code Online (Sandbox Code Playgroud)
我可以显式设置TimeZone在SimpleDateFormat上使用以获得预期的输出,但我不认为这是必要的.有什么我想念的吗?有替代日期解析器吗?
我有一个标准ISO 8601格式的字符串,其中包含从Web服务返回的日期/时间,如下所示:
String dtStart = "2010-10-15T09:27:37Z"
Run Code Online (Sandbox Code Playgroud)
如何将其转换为时间或日期等对象?我最初想要以不同的格式输出它,但是稍后需要用它做其他的东西(也就是说可能以不同的格式使用).
干杯
我无处可寻.我从返回标准JSON日期的API中获取一些JSON.您可以通过在JavaScript控制台中运行此代码来查看格式:
> new Date().toJSON();
"2010-10-27T11:58:22.973Z"
Run Code Online (Sandbox Code Playgroud)
好吧,实际上,我正在使用的API不是返回毫秒部分,有时它会返回一个时区而不是Z
,因此日期可能看起来像这些中的任何一个:
2010-10-27T11:58:22Z
2010-10-27T11:58:22+03:00
解析这些日期有点麻烦.有没有办法解析这些日期,使用org.json
?
我目前的解决方案是:
public static Date parseDateTime(String dateString) {
if (dateString == null) return null;
DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ssZ");
if (dateString.contains("T")) dateString = dateString.replace('T', ' ');
if (dateString.contains("Z")) dateString = dateString.replace("Z", "+0000");
else
dateString = dateString.substring(0, dateString.lastIndexOf(':')) + dateString.substring(dateString.lastIndexOf(':')+1);
try {
return fmt.parse(dateString);
}
catch (ParseException e) {
Log.e(Const.TAG, "Could not parse datetime: " + dateString);
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
啊!
我试图解析W3C XML Schema日期,如下所示
"2012-05-15T07:08:09+03:00"
Run Code Online (Sandbox Code Playgroud)
它符合W3C XML Schema dateTime规范的ISO 8601版本.
在上述日期中,时区标识符是"+03:00"
,但SimpleDateFormat
显然不存在表示它的模式.
如果时区是"+0300"
,那么Z
(大写)将是适用的并且SimpleDateFormat
模式将是
yyyy-MM-dd'T'HH:mm:ssZ
Run Code Online (Sandbox Code Playgroud)
类似地,如果时区是"GMT+03:00"
,那么z
(小写)将是适用的并且SimpleDateFormat
模式将是
yyyy-MM-dd'T'HH:mm:ssz
Run Code Online (Sandbox Code Playgroud)
('Z'
顺便说一句,大写也适用).
那么,是否有一种SimpleDateFormat
模式或解决方法来表示上述日期而无需预处理日期字符串?
Youtube V3 API使用ISO8601时间格式来描述视频的持续时间.有点像"PT1M13S".现在我想将字符串转换为秒数(例如在这种情况下为73).
是否有任何Java库可以帮助我轻松完成Java 6下的任务?或者我必须自己做正则表达式的任务?
编辑
最后,我接受@Joachim Sauer的回答
示例代码Joda
如下.
PeriodFormatter formatter = ISOPeriodFormat.standard();
Period p = formatter.parsePeriod("PT1H1M13S");
Seconds s = p.toStandardSeconds();
System.out.println(s.getSeconds());
Run Code Online (Sandbox Code Playgroud) 我正在尝试从/向JavaScript应用程序序列化/反序列化日期.
服务器端,我用java,JodaTime安装就可以了.我发现了如何使用UTC时区序列化到ISO,但无法找到如何进行反向操作.
这是我的代码
public static String getIsoDate( Date date )
{
SimpleDateFormat dateToIsoDateString = new SimpleDateFormat( ISO_8601_DATE_FORMAT );
TimeZone tz = TimeZone.getTimeZone("UTC");
dateToIsoDateString.setTimeZone( tz );
return dateToIsoDateString.format( date );
}
// this will return a date with GMT timezone
public static Date getDateFromIsoDateString( String iso8601date )
{
DateTimeFormatter jodaParser = ISODateTimeFormat.dateTimeNoMillis();
return jodaParser.parseDateTime( iso8601date ).toDate();
}
Run Code Online (Sandbox Code Playgroud)
我不介意使用或不使用Joda,只需要一个快速和有效的解决方案,
谢谢
我有解析日期的代码如下:
String ALT_DATE_TIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSZ";
SimpleDateFormat sdf = new SimpleDateFormat(
ALT_DATE_TIME_FORMAT);
Date date = sdf.parse(requiredTimeStamp);
Run Code Online (Sandbox Code Playgroud)
它工作正常,突然,这停止了工作.事实证明,管理员在服务器上进行了一些配置更改,并且当前正在返回日期为"2010-12-27T10:50:44.000-08:00",这是上述模式无法解析的.我有两个问题:
第一个是什么模式将以上述格式解析JVM返回的日期(具体来说,只是'-08:00'作为时区)?第二,在Linux RHEL 5服务器上究竟会改变这样的设置,以便我们在将来意识到这些变化?
java ×9
date ×3
datetime ×3
iso8601 ×3
timezone ×3
android ×2
parsing ×2
date-format ×1
gmt ×1
javascript ×1
jodatime ×1
json ×1
localization ×1
mongodb ×1
threetenabp ×1
threetenbp ×1
time-format ×1
youtube-api ×1