Вычисление дня, учитывая Дату

Я рекомендую использовать window.location, как другие любезно заявили.

Однако вы также можете сделать это, импортировав общую библиотеку Angular 'Location' и используя ее в виде инъекций, например:

import { Injectable } from '@angular/core';
import { Location }   from '@angular/common';
const otherPort = 8000;

@Injectable()
export class ServiceOrComponentName {
  constructor(location: Location) {
    this.baseUrl = location._platformStrategy._platformLocation._location.protocol +
      '//' + location._platformStrategy._platformLocation._location.hostname +
      ':' + otherPort;
  }
}
5
задан Kent Beck 31 May 2009 в 00:06
поделиться

7 ответов

Вам следует рассмотреть возможность удаления встроенного API дат. Вместо этого используйте API даты и времени Joda.

Вот возможность замены вашего метода.

private Date day(Date creation) {
    return new DateMidnight(creation).toDate();
}

Вот простой тест:

public static void main(String[] args) {
    final Date creation = new Date();
    final Date midnight = new Foobar().day(creation);
    System.out.println("creation = " + creation);
    System.out.println("midnight = " + midnight);
}

Результат:

creation = Sun May 31 10:09:38 CEST 2009    
midnight = Sun May 31 00:00:00 CEST 2009
7
ответ дан 18 December 2019 в 10:48
поделиться

JODA может иметь лучшее решение за счет другой зависимости от библиотеки. Я смотрю на его свойство DateMidnight . Извините, что не могу ответить более авторитетно, но я сам не использую JODA.

5
ответ дан 18 December 2019 в 10:48
поделиться

Если вы ищете местное время, это лучшее, что вы можете получить. И хотя вы можете считать это уродливым, (потенциально) многое происходит за кулисами.

Если вам нужна полночь по всемирному координированному времени, следующее будет работать:

public static void main(String[] argv)
throws Exception
{
    final long MILLIS_PER_DAY = 24 * 3600 * 1000L;

    long midnightUTC = (System.currentTimeMillis() / MILLIS_PER_DAY) * MILLIS_PER_DAY;
}

Изменить : Я действительно не рекомендую использовать местные даты в "производственном" коде. Они вызывают больше проблем, чем они того стоят - представьте человека на западном побережье США, который внезапно обнаруживает, что его / ее "день" сокращен на 3 часа, потому что компьютер на восточном побережье имеет другое представление о полуночи.

2
ответ дан 18 December 2019 в 10:48
поделиться

JODA - это то, что вам нужно, если у вас серьезные потребности в календаре, по крайней мере, до тех пор, пока JSR-310 не войдет в JDK (возможно, 1.7, если не 1.8) .

Тем не менее, есть несколько вещей, которые можно сделать, чтобы сделать этот код немного лучше.

import static java.util.Calendar.*;

...

private static final List<Integer> TIME_FIELDS = 
    Arrays.asList(HOUR_OF_DAY, MINUTE, SECOND, MILLISECOND);

private Date day(Date creation) {
     Calendar c = getInstance();
     c.setTime(creation);
     for(int field : TIME_FIELDS) c.set(field, 0);
     return c.getTime();
}

Это не принесет никаких наград за производительность. Вы можете создать стандартный цикл for, основанный на определенных значениях полей (класс Calendar имеет поле FIELD_COUNT, что означает, что вы можете делать что-то подобное), но это создает риски для разных реализаций JDK и между версиями.

1
ответ дан 18 December 2019 в 10:48
поделиться

Haven't programmed Java in a while, but you might be able to call this set method passing in the current values for year, month, and day. Although from reading a little close, you may have to call clear first. This may or may not be less verbose than using your current method.

0
ответ дан 18 December 2019 в 10:48
поделиться

I think the only way you're going to make this code significantly better is by a change in representation. For example,

  • Represent the day by the "absolute date" system explained by Nachum Dershowitz and Ed Reingold in Calendrical Calculations.

  • Represent the time by counting seconds from midnight. Or if you need sub-second resolution, count milliseconds.

From your brief example I can't tell at what points in your program you need to be compatible with existing Date and Calendar classes, or if you can create a useful subclass using a saner representation.

0
ответ дан 18 December 2019 в 10:48
поделиться

Это просто дополнение первоначально опубликованного кода. Он устанавливает год, месяц и день в новом объекте GregorianCalendar, вместо того, чтобы очищать все, кроме года, месяца и дня в переменной календаря. Это не так уж и много улучшений, но я думаю, что будет яснее сказать, какие поля вы копируете, а не какие поля игнорируете.

public Date day(Date creation) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(creation);
    return new GregorianCalendar(
            calendar.get(Calendar.YEAR),
            calendar.get(Calendar.MONTH),
            calendar.get(Calendar.DAY_OF_MONTH)).getTime();
}

Лично я думаю, что я бы выбрал библиотеку Joda, предложенную другими.

0
ответ дан 18 December 2019 в 10:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: