减去日期和时间

时间:2014-04-09 08:54:48

标签: java arrays date

我试图从文件中减去两个连续行的日期和时间,例如:

String result1=line2-line1;
String result2=line4-line3;
// and so on.........

示例文件内容可能如下:

 Thu Jan 16 2014 16:59:43.5020 
 Thu Jan 16 2014 16:59:43.5020 
 Thu Jan 16 2014 16:59:43.5020 
 Thu Jan 16 2014 16:59:43.5090 
 Thu Jan 16 2014 16:59:43.5100 
 Thu Jan 16 2014 16:59:43.5100 
 Thu Jan 16 2014 16:59:43.5170 
 Thu Jan 16 2014 16:59:43.9190 
 Thu Jan 16 2014 16:59:43.9200 
 Thu Jan 16 2014 16:59:43.9200 
 Thu Jan 16 2014 16:59:43.9200 
 Thu Jan 16 2014 16:59:43.9210 
 Thu Jan 16 2014 16:59:43.9210 
 Thu Jan 16 2014 16:59:43.9210 
 Thu Jan 16 2014 16:59:43.9210 
 Thu Jan 16 2014 16:59:43.9210 
 Thu Jan 16 2014 16:59:43.9220 
 Thu Jan 16 2014 16:59:43.9290 
 Thu Jan 16 2014 16:59:43.9290 
 Thu Jan 16 2014 16:59:43.9290 
 Thu Jan 16 2014 16:59:43.9330 
 Thu Jan 16 2014 16:59:44.0210 
 Thu Jan 16 2014 16:59:44.0210 
 Thu Jan 16 2014 16:59:44.0210 

5 个答案:

答案 0 :(得分:1)

使用子句

DateFormat df = new SimpleDateFormat("EEE MMM dd yyyy HH:mm:ss.SSSS", Locale.ENGLISH);

System.out.println( df.parse(line2).getTime() - df.parse(line1).getTime() );

答案 1 :(得分:0)

尝试以下代码...

您可以根据需要实施基本逻辑

String string1 = "Oct 15, 2012 1:07:13 PM";
String string2 = "Oct 23, 2012 03:43:34 PM";
//here you want to mention the format that you want
SimpleDateFormat sdf = new SimpleDateFormat("MMM d, yyyy h:mm:ss a", Locale.ENGLISH);
Date date1 = sdf.parse(string1);
Date date2 = sdf.parse(string2);
//to found difference between two dates
long differenceInMillis = date2.getTime() - date1.getTime();

答案 2 :(得分:0)

假设您已获得该文件的上下文。 string line1包含第一行的文本,第二行的string line2contain文本。

    int datedifference=Integer.parseInt(line2.substring(8,10))-Integer.parseInt(line1.substring(8,10));
    int yeardifference=Integer.parseInt(line2.substring(11,15))-Integer.parseInt(line1.substring(11,15));
    int hourdifference=Integer.parseInt(line2.substring(16,18))-Integer.parseInt(line1.substring(16,18));
    int minutedifference=Integer.parseInt(line2.substring(19,21))-Integer.parseInt(line1.substring(19,21));
    int seconddifference=Integer.parseInt(line2.substring(22,23))-Integer.parseInt(line1.substring(22,23));
    int lastthingdifference=Integer.parseInt(line2.substring(24,28))-Integer.parseInt(line1.substring(24,28));

然后你得到了你需要的所有内容,只需按你喜欢的方式重新排列

注意:对于日期,您可能必须设置将天数转换为int的逻辑。

干杯

答案 3 :(得分:0)

这将修剪任何空白区域......我在这里得到这个你应该非常小心地提到你想要提取的字符串索引并减去例如:

 startIndex:starts from index 0(inclusive).

 endIndex:starts from index 1(exclusive).

int datedifference = Integer.parseInt(line2.substring(8,10).trim()) - Integer.parseInt(line1.substring(8,10).trim());

答案 4 :(得分:0)

TL;博士

Duration.between(                               // Calculate and represent the span of time elapsed.
    LocalDateTime.parse(                        // Parse the input string as a `LocalDateTime` because it lacks any indicator of time zone or offset-from-UTC.
        "Thu Jan 16 2014 16:59:43.5020" ,       // Work with each pair of input strings.
        DateTimeFormatter.ofPattern( "EEE MMM dd uuuu HH:mm:ss.SSSS" , Locale.US )  // Define a formatting pattern to match your input. Specify human language for translation via `Locale` object.
    ) ,
    LocalDateTime.parse(
        "Thu Jan 16 2014 16:59:43.5090" , 
        DateTimeFormatter.ofPattern( "EEE MMM dd uuuu HH:mm:ss.SSSS" , Locale.US )
    ) 
)

文件行

List行的形式阅读您的文件。

List< String > lines = Files.readAllLines( pathGoesHere ) ;

ISO 8601

顺便说一句,你的问题中使用的格式很糟糕。

尽可能使用标准ISO 8601格式将日期时间值序列化为文本。

java.time

现代方法使用行业领先的 java.time 类,这些类取代了麻烦的旧遗留类,例如Date / Calendar / SimpleDateFormat。< / p>

定义匹配每一行的格式化模式。请注意Locale参数,该参数指定在翻译文本时使用的人类语言和文化规范。

DateTimeFormatter f = DateTimeFormatter.ofPattern( "EEE MMM dd uuuu HH:mm:ss.SSSS" , Locale.US ) ;  // Thu Jan 16 2014 16:59:43.5020

将每个输入行解析为LocalDateTime,因为输入缺少任何时区指示符或与UTC的偏移量。

LocalDateTime ldt = LocalDateTime.parse( "Thu Jan 16 2014 16:59:43.5020" , f  );
  

ldt.toString():2014-01-16T16:59:43.502

循环输入行,缓存每一对,并进行比较。使用Duration类计算并表示经过的时间跨度。

for( int index = 0 , index < lines.size() , index + 2 ) { // Increment by two, as we are processing pairs together.
    String inputStart = lines.get( index ) ;
    LocalDateTime start = LocalDateTime.parse( inputStart , f  ) ;

    String inputStop = lines.get( index + 1 ) ;  // Move index to second of this pair of lines.
    LocalDateTime stop = LocalDateTime.parse( inputStop , f  ) ;

    // Calculate the time elapsed using generic 24-hour based days, as we lack any time zone or offset-from-UTC.
    Duration d = Duration.between( start , stop ) ; 
}

您可以通过各种方式使用该Duration对象:

  • 要求总秒数,分钟数等。
  • 通过调用to…Part方法询问每个部分:小时,分钟和秒以及小数秒。
  • 在标准ISO 8601 format PnYnMnDTnHnMnS中生成字符串,其中P标记开头,T将小时 - 分钟 - 秒与任何年 - 月 - 天分开。
  • 转到各种 java.time 类中的plus / minus方法。

时区

请注意,上述解决方案不值得信赖,因为LocalDateTime 代表片刻,时间轴上的某个点。要确定片刻,您必须将LocalDateTime放入特定时区的上下文中。在那之前,它没有任何实际意义。 Duration计算使用通用的24小时工作日完成,而不考虑夏令时(DST)等异常情况。

如果您确定知道输入数据的时区,请应用ZoneId获取ZonedDateTime

continent/region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用诸如ESTIST之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "America/Montreal" ) ;  
ZonedDateTime zdtStart = start.atZone( z ) ;

然后继续计算Duration

Duration d = Duration.between( zdtStart , zdtStop ) ;

关于 java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和&amp; SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

从哪里获取java.time类?