Moo*_*ght 4 c# java datetime date-parsing
我是Java的新手.我有时间从网页上获取,这是"hh:mm"格式(不是24小时).这对我来说是一个字符串.然后我想将这个字符串与今天的日期结合起来,以便创建一个Date我可以使用的Java .
在C#中:
string s = "5:45 PM";
DateTime d;
DateTime.TryParse(s, out d);
Run Code Online (Sandbox Code Playgroud)
在Java中我尝试过:
String s = "5:45 PM";
Date d = new Date(); // Which instantiates with the current date/time.
String[] arr = s.split(" ");
boolean isPm = arr[1].compareToIgnoreCase("PM") == 0;
arr = arr[0].split(":");
int hours = Integer.parseInt(arr[0]);
d.setHours(isPm ? hours + 12 : hours);
d.setMinutes(Integer.parseInt(arr[1]));
d.setSeconds(0);
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来实现我想要的?
Jon*_*eet 13
有没有更好的方法来实现我想要的?
绝对 - 实际上在.NET和Java中都是如此.在.NET中,我(以偏向的方式)推荐使用Noda Time,这样您就可以只表示一天中的某个时间LocalTime,精确地解析您期望的模式.
在Java 8中,您可以使用以下内容执行相同的操作java.time.LocalTime:
import java.time.*;
import java.time.format.*;
public class Test {
public static void main(String[] args) {
String text = "5:45 PM";
DateTimeFormatter format = DateTimeFormatter.ofPattern("h:mm a");
LocalTime time = LocalTime.parse(text, format);
System.out.println(time);
}
}
Run Code Online (Sandbox Code Playgroud)
一旦你解析了你已经进入适当类型的文本,就可以将它与其他类型结合起来.例如,要ZonedDateTime使用今天的日期和指定的时间来获取系统时区,您可以使用:
ZonedDateTime zoned = ZonedDateTime.now().with(time);
Run Code Online (Sandbox Code Playgroud)
默认情况下使用系统时区和时钟,很难测试 - 我建议传入一个Clock可测试性.
(Noda Time也提供同样的东西,但略有不同.如果您需要详细信息,请告诉我.)
我强烈建议不要使用java.util.Date,这只是代表一个瞬间,并有一个糟糕的API.
这里的关键点是:
所有这些都将导致清晰,可靠,可测试的代码.(并且现有的.NET代码不符合任何这些要点,IMO.)