如何获得当年1月1日开始以来的小时数?

时间:2015-08-13 06:35:41

标签: java algorithm date datetime jodatime

如何获得自Java当年1月1日开始以来的小时数? I. e。 1月1日的第一个小时= 0001 我可以使用JodaTime或任何其他lib来完成此操作吗? 谢谢,

3 个答案:

答案 0 :(得分:4)

使用Java 8及更高版本(java.time package)中内置的Tutorial

ChronoUnit.HOURS.between(
  LocalDateTime.of(LocalDateTime.now().getYear(), 1, 1, 0, 0), 
  LocalDateTime.now())

我认为这是自我解释的

答案 1 :(得分:4)

使用Java 8 API进行日期/时间

  +(NSAttributedString *) returnRichTextForString:(NSString *) inputString {

  NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithData:[inputString dataUsingEncoding:NSUTF8StringEncoding]  options:@{
                                                                                                                                                                 NSDocumentTypeDocumentAttribute:  NSHTMLTextDocumentType,
                                                                                                                                                                 NSCharacterEncodingDocumentAttribute: @(NSUTF8StringEncoding)
                                                                                                                                                              }
                                                                           documentAttributes:nil
                                                                                        error:nil];


 [attributedString beginEditing];

   //Hack for italic/skew effect to custom fonts
 [attributedString enumerateAttribute:NSParagraphStyleAttributeName inRange:NSMakeRange(0, attributedString.length) options:0 usingBlock:^(id value, NSRange range, BOOL *stop) {

    if (value) {

        NSMutableParagraphStyle *myStyle = (NSMutableParagraphStyle *)value;

        if (myStyle.minimumLineHeight == 99) {
            [myStyle setMinimumLineHeight:0];
            [attributedString addAttribute:NSObliquenessAttributeName
                                     value:[NSNumber numberWithFloat:0.30] range:range];
        }

    }
}];

     //Hack for bold effect.
 [attributedString enumerateAttribute:NSStrikethroughStyleAttributeName inRange:NSMakeRange(0, attributedString.length) options:0 usingBlock:^(id value, NSRange range, BOOL *stop) {

     if (value) {

        [attributedString addAttribute:NSStrokeWidthAttributeName
                                                 value:[NSNumber numberWithFloat:-3.0] range:range];

        [attributedString addAttribute:NSStrikethroughStyleAttributeName
                                 value:[NSNumber numberWithFloat:0.0] range:range];
      }

}];


[attributedString endEditing];

return attributedString;
}

答案 2 :(得分:1)

我强烈怀疑许多用户宁愿将dst-effects考虑在内:

ZoneId zi = ZoneId.of("Europe/Paris"); // example

ZonedDateTime now = ZonedDateTime.now(zi);
ZonedDateTime start = ZonedDateTime.of(now.getYear(), 1, 1, 0, 0, 0, 0, zi);
long realDelta = ChronoUnit.HOURS.between(start, now);
System.out.println("hours between: " + realDelta); // 5386

// another way using Instant
Instant i2 = now.toInstant();
Instant i1 = start.toInstant();
System.out.println(i1); // 2014-12-31T23:00:00Z
System.out.println(i2); // 2015-08-13T09:55:53.353Z
System.out.println("duration=" + i1.until(i2, ChronoUnit.HOURS)); // 5386

到目前为止,基于LocalDateTime而没有任何时区的建议解决方案将产生不同的结果(此处仅为名义而非物理持续时间):

LocalDateTime ldt2 = LocalDateTime.now();
LocalDateTime ldt1 = LocalDateTime.of(ldt2.getYear(), 1, 1, 0, 0);
long hoursBetween = ChronoUnit.HOURS.between(ldt1, ldt2);
System.out.println("hours between: " + hoursBetween); // 5385

如果java.util.GregorianCalendar,结果将与基于ZonedDateTime的Java-8相同。其他图书馆也提供类似的结果,但我忽略了这些细节,因为了解时区对结果的影响更为重要。