Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.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.util.Date/Joda DateTime_Java_Jodatime - Fatal编程技术网

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

毫秒自动添加到java.util.Date/Joda DateTime,java,jodatime,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); 当我调试并检查变量时,我看到: 通

我正在尝试创建一个没有毫秒部分的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);
当我调试并检查变量时,我看到:


通过格式化日期得到的字符串没有任何毫秒。但是,当我从字符串创建日期回溯时,它有毫秒部分

我也使用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时,它会将毫秒加回来

我是不是遗漏了什么?我需要使用两个不同的格式化程序还是什么?

如果您的SDK需要java.util.Date,那么谈论格式就没有意义了,因为

Date类表示一个数值:自该日期起的毫秒数。要使日期不包含毫秒,可以截断此毫秒值:

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时代,它有点简单:

// set milliseconds to zero
DateTime dt = new DateTime().withMillisOfSecond(0);
// convert to java.util.Date
Date date = dt.toDate();
但是,如果SDK需要字符串,那么讨论格式是有意义的。日期可以用多种不同的方式在文本中表示:

2018-03-22T09:30:22-07:00 2018年3月22日上午9:30:22 22/03/2018 09:30:22.000 等等 像java.util.Date和Joda的DateTime这样的对象没有格式。它们通常只包含数值,所以如果SDK需要这些对象中的一个,只需传递它们,就不用担心了

如果SDK需要一个特定格式的字符串,即表示日期的文本,那么应该将日期对象转换为该格式

如果这种格式不允许毫秒,那就这样吧:

Date d = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
String dateFormattedAsString = sdf.format(d);
乔达时间:

DateTime dt = new DateTime();
DateTimeFormatter fmt = ISODateTimeFormat.dateTimeNoMillis();
String dateFormattedAsString = fmt.print(dt);

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

没有毫秒是什么意思?日期表示具有毫秒精度的时间戳。您只是不希望它们显示在从该日期创建的字符串中吗?但是,当我从该字符串创建日期时,它有毫秒部分。这不是你的截图所显示的-dFromStr似乎在秒上,即毫秒为0。这不是你想要达到的吗?@SotiriosDelimanolis这就是我困惑的地方。我实际上使用的是第三方SDK,它接受java.util.Date作为其中一个方法的参数。文件上说应该是2018-03-19T15:04:23+00:00格式。所以我不太清楚我该如何做到这一点。我一直从SDK中得到一个无效的格式异常。@JonSkeet我想完全删除毫秒部分。SDK非常模糊,我们不知道您指的是哪一个SDK,但如果它声称在接受java.util.Date时需要特定的文本格式,那么这是不正确的。这就像有一个int参数,并且说它必须是十六进制的。