我的方法接受 - 以符号 / 分隔的小时、分钟、秒和毫秒作为字符串参数 如何将方法中的参数添加到当前日期。
示例1:今天,02/10/2021,该方法接收到metnode数据(10/10/10/10)-输出-02/10/2021 10:10:10
示例2:今天,02/10/2021,该方法接收到metnode数据(55/10/10/10)-输出-02/12/2021 07:10:10 也就是说,您需要在当前日期上加上 55 小时 10 秒 10 秒和 10 毫秒。
您不能使用 Calendar 和 StringTokenizer 类。
public void method(String s) {
s = s.replaceAll("/", "-");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss");
final LocalDateTime now = LocalDateTime.parse(s, formatter.withResolverStyle(ResolverStyle.LENIENT));
System.out.println(now);
}
我找到了 withResolverStyle (ResolverStyle.LENIENT) 方法 但是不明白怎么用。
答案 0 :(得分:2)
DateTimeFormatter
就够了我不知道这是否是最好的解决方案。这可能取决于口味。它确实使用了您提到的 ResolverStyle.LENIENT
,并且通常按照您问题中的代码行工作,只是经过修复和稍微简化。
我的格式化程序包括日期和时间。这对于将剩余小时数转换为天数是必要的。
private static final DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendPattern("uuuu-MM-dd H/m/s/")
.appendValue(ChronoField.MILLI_OF_SECOND)
.toFormatter()
.withResolverStyle(ResolverStyle.LENIENT);
接下来我们需要一个与格式化程序匹配的字符串。因此,让我们将日期添加到我们已经获得的时间字符串中:
String timeString = "55/10/10/10";
LocalDate today = LocalDate.now(ZoneId.of("America/Regina"));
String dateTimeString = "" + today + ' ' + timeString;
LocalDateTime dateTime = LocalDateTime.parse(dateTimeString, formatter);
System.out.println(dateTime);
我今天(2 月 10 日)运行代码时的输出是:
<块引用>2021-02-12T07:10:10.010
Duration
编辑:另一种方法是使用 Duration
类。这样做的一个原因是,您似乎确实在添加持续时间而不是设置一天中的时间。一个缺点是将您的字符串解析为 Duration
有点棘手。我们要使用的 Duration.parse
方法仅接受 ISO 8601 格式。它像 PT55H10M10.010S
一样持续 55 小时 10 分 10.010 秒。是的,毫秒需要作为秒的一小部分给出。
String isoTimeString = timeString.replaceFirst("(/)(\\d+)$", "$100$2")
.replaceFirst("(\\d+)/(\\d+)/(\\d+)/0*(\\d{3})", "PT$1H$2M$3.$4S");
Duration dur = Duration.parse(isoTimeString);
LocalDateTime dateTime = LocalDate.now(ZoneId.of("Asia/Kathmandu"))
.atStartOfDay()
.plus(dur);
当我刚刚运行它时——已经是 2 月 11 日在尼泊尔加德满都——输出是:
<块引用>2021-02-13T07:10:10.010
我使用了两次对 replaceFirst()
的调用,每次都使用一个正则表达式。第一次调用只是在毫秒中添加一些前导零。替换字符串中的 $1
和 $2
给出了正则表达式中用圆括号表示的第一个和第二个组匹配的内容。
第二个 replaceFirst()
调用建立了 ISO 8601 格式,其中包括确保毫秒恰好是三位数字,以便它们作为秒的小数部分工作。
链接: ISO 8601
答案 1 :(得分:1)
查看 LocalDateTime documentation。它提供了多种组合日期的方法。如:
答案 2 :(得分:1)
为了简单起见,您可以使用 LocalDateTime 类。这很容易理解。请参考以下代码用于将小时、分钟、秒和纳秒添加到当前日期时间。 然后可以根据需要使用任何格式模式轻松格式化此日期时间。
class MainViewModel : ViewModel() {
private val _shouldCloseLiveData = MutableLiveData<Event<Boolean>>()
val shouldCloseLiveData: LiveData<Event<Boolean>> = _shouldCloseLiveData
fun someAction(){
_shouldCloseLiveData.postValue(Event(true))
}
}
答案 3 :(得分:1)
试试这个:
public void method(String s) {
String[] arr = s.split("/");
LocalDateTime now = LocalDateTime.of(
LocalDate.now(), LocalTime.of(0, 0))
.plusHours(Integer.parseInt(arr[0]))
.plusMinutes(Integer.parseInt(arr[1]))
.plusSeconds(Integer.parseInt(arr[2]))
.plusNanos(Integer.parseInt(arr[3]) * 1_000_000L);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm:ss");
System.out.println(now.format(formatter));
}