C#与Java中的DateTime操作

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