毫秒精度在有些业务场景没有必要存储,有时还会带来一些问题,清除它们可以简化处理和提高可读性。
清掉毫秒通常用于以下场景:
-
日志记录:在日志中,秒级别的时间戳足够精确,去掉毫秒可以减少日志的冗长和复杂性。
-
数据存储:在数据库中,某些字段(如创建时间、修改时间)通常以秒为单位存储,避免存储毫秒可以简化数据结构和查询。
-
用户界面:在用户界面中显示时间时,毫秒往往不需要,秒级别的时间更符合用户的需求,使信息更简洁易读。
-
数据同步:在不同系统或服务之间同步数据时,去掉毫秒可以避免因微小时间差异导致的同步冲突或问题。
一.LocalDateTime(常用)
LocalDateTime
是 Java 8 引入的日期时间类,它表示日期和时间,但不包含时区信息。
1. LocalDateTime.withNano(0)
方法会将当前 LocalDateTime
对象的纳秒部分设置为零。
import java.time.LocalDateTime;
public class Main {
public static void main(String[] args) {
LocalDateTime dateTime = LocalDateTime.now();
System.out.println("Original DateTime: " + dateTime);
LocalDateTime clearedDateTime = dateTime.withNano(0);
System.out.println("DateTime with Nano cleared: " + clearedDateTime);
}
}
2.truncatedTo(ChronoUnit.SECONDS),
截断到秒级别,自动去除毫秒部分。
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
public class Main {
public static void main(String[] args) {
LocalDateTime now = LocalDateTime.now();
LocalDateTime truncatedDateTime = now.truncatedTo(ChronoUnit.SECONDS);
System.out.println(truncatedDateTime);
}
}
3.plusNanos(),
这种方法常用于需要调整精度的情形,将当前时间加上负的纳秒值,从而清除毫秒部分。
import java.time.LocalDateTime;
public class Main {
public static void main(String[] args) {
LocalDateTime now = LocalDateTime.now();
LocalDateTime dateTimeWithoutMilliseconds = now.plusNanos(-now.getNano());
System.out.println(dateTimeWithoutMilliseconds);
}
}
二、除了使用 LocalDateTime
处理毫秒,还有以下几种方式来去除毫秒部分:
1.使用 SimpleDateFormat
类
import java.text.SimpleDateFormat;
import java.util.Date;
public class Main {
public static void main(String[] args) {
Date now = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String formattedDate = sdf.format(now);
System.out.println(formattedDate);
}
}
2.使用 Instant
类与 ZonedDateTime
类
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) {
ZonedDateTime now = Instant.now().atZone(ZoneId.systemDefault());
ZonedDateTime nowWithoutMilliseconds = now.withNano(0);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println(nowWithoutMilliseconds.format(formatter));
}
}
3.使用 Calendar
类
import java.util.Calendar;
import java.util.Date;
import java.text.SimpleDateFormat;
public class Main {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.MILLISECOND, 0);
Date nowWithoutMilliseconds = calendar.getTime();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String formattedDate = sdf.format(nowWithoutMilliseconds);
System.out.println(formattedDate);
}
}
以上这些方法各有适用场景,可以根据具体需求选择合适的方式来处理时间戳。