毫秒自动添加到java.util.Date / Joda DateTime

时间:2018-03-22 16:33:26

标签: java jodatime

我正在尝试创建一个没有毫秒部分的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);

当我调试这个并检查变量时,我看到了这个: enter image description here

我通过格式化日期得到的字符串没有任何毫秒。但是,当我从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种不同的格式化程序吗?

1 个答案:

答案 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,那么谈论格式是有意义的。可以用许多不同的方式表示日期(也称为“在文本中转换”):

  • 2018-03-22T09:30:22-07:00
  • 3月22日 nd 2018,9:30:22 AM
  • 22/03/2018 09:30:22.000
  • 等......

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

这些不会更改日期的值,但字符串不会打印毫秒。