我正在尝试创建一个没有毫秒部分的java.util.Date对象。例如:2018-03-19T15:04:23+00:00
。这是我的代码:
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
Date d = new Date();
String strFromD = sf.format(d);
Date dFromStr = sf.parse(strFromD);
我通过格式化日期得到的字符串没有任何毫秒。但是,当我从String创建一个日期时,它有毫秒部分。
我也尝试使用Joda DateTime:
DateTimeFormatter dateFormatter = ISODateTimeFormat.dateTimeNoMillis();
DateTime dt = new DateTime();
String strFromDt = dateFormatter.print(dt);
DateTime dtFromStr = dateFormatter.parseDateTime(strFromDt);
System.out.println("DT : "+dt);
System.out.println("String from DT : "+strFromDt);
System.out.println("DT from String : "+dtFromStr);
这是输出:
DT : 2018-03-22T09:30:22.996-07:00
String from DT : 2018-03-22T09:30:22-07:00
DT from String : 2018-03-22T09:30:22.000-07:00
同样,当我尝试从字符串中获取DateTime时,它会返回毫秒数。
我在这里遗漏了什么吗?我需要使用2种不同的格式化程序吗?
答案 0 :(得分:0)
如果您的SDK需要java.util.Date
,那么谈论格式是没有意义的,因为dates don't have a format。
Date
类表示一个数值:自Unix Epoch (Jan 1st 1970, at midnight, in UTC)以来的毫秒数。要创建一个没有毫秒的日期,您可以截断这个毫秒值:
Date d = new Date();
// truncate the number of milliseconds since epoch (eliminate milliseconds precision)
long secs = d.getTime() / 1000;
// create new Date with truncated value
d = new Date(secs * 1000);
在Joda-Time中,它有点简单:
// set milliseconds to zero
DateTime dt = new DateTime().withMillisOfSecond(0);
// convert to java.util.Date
Date date = dt.toDate();
如果您的SDK需要String
,那么谈论格式是有意义的。可以用许多不同的方式表示日期(也称为“在文本中转换”):
像java.util.Date
和Joda DateTime
这样的对象没有格式。它们只包含值(通常是数值),因此如果您的SDK需要其中一个对象,只需传递它们并且不用担心它。
如果SDK需要特定格式的String
(表示日期的文字),那么您应该将日期对象转换为该格式。
如果这种格式不允许毫秒,那就这样吧:
Date d = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
String dateFormattedAsString = sdf.format(d);
使用Joda-Time:
DateTime dt = new DateTime();
DateTimeFormatter fmt = ISODateTimeFormat.dateTimeNoMillis();
String dateFormattedAsString = fmt.print(dt);
这些不会更改日期的值,但字符串不会打印毫秒。