Java 如何获得ISO 8601格式的当前时刻,包括日期、小时和分钟?
获取当前UTC格式演示文稿的最优雅方式是什么?它应该是这样的:Java 如何获得ISO 8601格式的当前时刻,包括日期、小时和分钟?,java,Java,获取当前UTC格式演示文稿的最优雅方式是什么?它应该是这样的:2010-10-12T08:50Z 例如: String iso8601 = DateFormat.getDateTimeInstance(DateFormat.ISO_8601).format(date); 使用 ISO 8601日历系统是Joda时间内的默认实现 是JodaTime格式化程序的文档 编辑: 如果您不想添加或看不到添加上述库的价值,您可以使用内置的SimpleDateFormat类将日期格式化为所需的ISO格式 正
2010-10-12T08:50Z
例如:
String iso8601 = DateFormat.getDateTimeInstance(DateFormat.ISO_8601).format(date);
使用
ISO 8601日历系统是Joda时间内的默认实现
是JodaTime格式化程序的文档
编辑:
如果您不想添加或看不到添加上述库的价值,您可以使用内置的SimpleDateFormat
类将日期格式化为所需的ISO格式
正如@Joachim Sauer所建议的
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mmZ");
String nowAsString = df.format(new Date());
用于格式化所需的任何对象:
TimeZone tz = TimeZone.getTimeZone("UTC");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'"); // Quoted "Z" to indicate UTC, no timezone offset
df.setTimeZone(tz);
String nowAsISO = df.format(new Date());
使用如上所示的
新日期()
将格式化当前时间。Java8:
thisMoment = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mmX")
.withZone(ZoneOffset.UTC)
.format(Instant.now());
thisMoment = String.format("%tFT%<tRZ",
Calendar.getInstance(TimeZone.getTimeZone("Z")));
前Java 8:
thisMoment = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mmX")
.withZone(ZoneOffset.UTC)
.format(Instant.now());
thisMoment = String.format("%tFT%<tRZ",
Calendar.getInstance(TimeZone.getTimeZone("Z")));
thismome=String.format(“%tFT%”,适用于默认时区不是UTC的系统:
TimeZone tz = TimeZone.getTimeZone("UTC");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'");
df.setTimeZone(tz);
String nowAsISO = df.format(new Date());
如果经常需要,可以将SimpleDataFormat
实例声明为全局常量,但请注意此类不是线程安全的。如果由多个线程并发访问,则必须对其进行同步
编辑:如果要进行许多不同的时间/日期操作,我更喜欢Joda Time…
EDIT2:corrected:setTimeZone
不接受字符串(由Paul更正)试试这个
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSSSZ");
String date=sdf.format (new Date() );
如果您不想包含Jodatime(尽管它很好),它适用于ISO 8601格式
返回以下字符串:
2012-07-10T16:02:48.440Z
这与最初的请求略有不同,但仍然是ISO-8601。这里有一个经过优化的完整类,这样调用“now()”就不需要做更多的事情了
public class Iso8601Util
{
private static TimeZone tz = TimeZone.getTimeZone("UTC");
private static DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'");
static
{
df.setTimeZone(tz);
}
public static String now()
{
return df.format(new Date());
}
}
从Apachecommons-lang3
中有有用的常量,例如:DateFormatUtils.ISO_DATETIME_FORMAT
iso8601可能包含秒
看
所以代码应该是
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
对于Java版本7
您可以遵循Oracle文档:
X-用于ISO 8601时区
TimeZone tz = TimeZone.getTimeZone("UTC");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX");
df.setTimeZone(tz);
String nowAsISO = df.format(new Date());
System.out.println(nowAsISO);
DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX");
//nowAsISO = "2013-05-31T00:00:00Z";
Date finalResult = df1.parse(nowAsISO);
System.out.println(finalResult);
乔达时间
更新:项目现在已经开始,团队建议迁移到类。关于Java 6和7,请参阅项目中的项目,该项目进一步适用于Android
使用图书馆
String output = new DateTime( DateTimeZone.UTC ).toString() ;
这是线程安全的。Joda Time创建新对象而不是更改现有对象
如果您真的想要请求一种没有秒的格式,解析为分钟,那么使用Joda Time中的许多其他内置格式化程序之一
DateTime now = new DateTime( DateTimeZone.UTC ) ;
String output = ISODateTimeFormat.dateHourMinute.print( now ) ;
java.time
对于Java 8和更高版本,Joda Time仍然有效。但是内置框架取代了Joda Time。因此,请尽快将代码从Joda Time迁移到Java.Time
有关现代解决方案,请参阅
关于java.time
该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,如,&
该项目现已启动,建议迁移到类
要了解更多信息,请参阅.和搜索堆栈溢出以获取许多示例和解释。规范为
您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要java.sql.*
classes
从哪里获得java.time类
- 然后
- 内置的
- 标准JavaAPI的一部分,带有捆绑实现
- Java9添加了一些次要功能和修复
- 及
- 大部分java.time功能都在中向后移植到Java6和Java7
-
- 更高版本的Android捆绑包实现了java.time类
- 对于早期的Android(Java8本机)
使它变得简单,因为Java8.0和线程安全
ZonedDateTime.now( ZoneOffset.UTC ).format( DateTimeFormatter.ISO_INSTANT )
结果:2015-04-14T11:07:36.639Z
您可能会尝试使用更轻的时态
,例如即时
或本地日期时间
,
但它们缺乏格式化程序支持或时区数据。
只有zoneDateTime
是现成的
通过调整或链接和的选项/操作,您可以在一定程度上轻松控制和:
ZonedDateTime.now( ZoneId.of( "Europe/Paris" ) )
.truncatedTo( ChronoUnit.MINUTES )
.format( DateTimeFormatter.ISO_DATE_TIME )
结果:2015-04-14T11:07:00+01:00[欧洲/巴黎]
细化的需求,例如删除秒部分,仍然必须通过自定义格式或自定义后期处理来满足
.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME ) // 2015-04-14T11:07:00
.format( DateTimeFormatter.ISO_LOCAL_DATE ) // 2015-04-14
.format( DateTimeFormatter.ISO_LOCAL_TIME ) // 11:07:00
.format( DateTimeFormatter.ofPattern( "yyyy-MM-dd HH:mm" ) ) // 2015-04-14 11:07
6和7,可以考虑Java.Time:
两者都比Joda轻,并且从Joda的-esp.中学习到java.time是由Joda的作者设计的
从Java 8开始,您只需执行以下操作:
Instant.now().toString();
从文档中:
publicstaticinstantnow()
从系统时钟获取当前时刻
这将查询以获取当前即时信息
公共字符串toString()
使用ISO-8601表示法的该瞬间的字符串表示法
使用的格式与相同
对于ISO 8601,您可以将Java与以下模式一起使用yyyy-MM-dd'HH:MM:ssXXX
示例代码:(列出所有可用时区)
您可以使用:
TimeZone.getDefault()
用于默认vm时区。详细信息
您可能会注意到一些以'Z'
结尾的时区的日期时间。这些时区的偏移量为'0'
可以找到更多信息。不过,joda time只支持扩展格式:
“2015-12-09T00:22:42.930Z”
不是基本的:
“20151209T002242.930Z”
…我们最好使用java SimpleDateFormat测试一系列格式。我在Android中使用Calendar和SimpleDateFormat进行了测试。以下方法返回带有“GMT”时区的日历(这是通用时区)。然后,您可以使用Calendar类的方法setTimeZone()设置不同时区之间的小时数
private static final String GMT = "GMT";
private static final String DATE_FORMAT_ISO = "yyyyMMdd'T'HHmmss";
public static Calendar isoToCalendar(final String inputDate) {
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone(GMT));
try {
SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT_ISO, Locale.US);
dateFormat.setTimeZone(TimeZone.getTimeZone(GMT));
Date date = dateFormat.parse(inputDate);
calendar.setTime(date);
} catch (ParseException e) {
Log.e("TAG",e.getMessage());
}
return calendar;
}
记住:
Date类没有
String d = new Date().toInstant().toString();
private static String getCurrentDateIso()
{
// Returns the current date with the same format as Javascript's new Date().toJSON(), ISO 8601
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US);
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
return dateFormat.format(new Date());
}
Instant.ofEpochMilli(date.getTime()).toString();
DateTimeFormatter.ISO_DATE_TIME
.withZone(ZoneOffset.UTC)
.format(yourDateObject.toInstant())
Instant.now() // Capture the current moment in UTC with a resolution as fines nanoseconds but usually in microseconds or milliseconds.
.truncatedTo( ChronoUnit.MINUTES ) // Lop off any seconds or fractional second, to get a value in whole minutes.
.toString() // Generate a String in standard ISO 8601 format where a `T` separates the year-month-day from the hour-minute-second, and the `Z` on the end for “Zulu” means UTC.
Instant instant = Instant.now() ;
Instant instant = Instant.now().truncatedTo( ChronoUnit.MINUTES ) ;
String output = instant.toString(); // Generate a `String` object in standard ISO 8601 format.