Я рекомендую использовать 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;
}
}
Вам следует рассмотреть возможность удаления встроенного 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
JODA может иметь лучшее решение за счет другой зависимости от библиотеки. Я смотрю на его свойство DateMidnight . Извините, что не могу ответить более авторитетно, но я сам не использую JODA.
Если вы ищете местное время, это лучшее, что вы можете получить. И хотя вы можете считать это уродливым, (потенциально) многое происходит за кулисами.
Если вам нужна полночь по всемирному координированному времени, следующее будет работать:
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 часа, потому что компьютер на восточном побережье имеет другое представление о полуночи.
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 и между версиями.
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.
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.
Это просто дополнение первоначально опубликованного кода. Он устанавливает год, месяц и день в новом объекте 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, предложенную другими.