Вот реализация, которую я добавил как дополнительный метод к классу DateTime, который обрабатывает и будущие и прошлые даты и предоставляет возможность приближения, которая позволяет Вам определять уровень детализации, который Вы ищете ("3-часовой назад" по сравнению с "3 часами, 23 минутами, 12 секунд назад"):
using System.Text;
/// <summary>
/// Compares a supplied date to the current date and generates a friendly English
/// comparison ("5 days ago", "5 days from now")
/// </summary>
/// <param name="date">The date to convert</param>
/// <param name="approximate">When off, calculate timespan down to the second.
/// When on, approximate to the largest round unit of time.</param>
/// <returns></returns>
public static string ToRelativeDateString(this DateTime value, bool approximate)
{
StringBuilder sb = new StringBuilder();
string suffix = (value > DateTime.Now) ? " from now" : " ago";
TimeSpan timeSpan = new TimeSpan(Math.Abs(DateTime.Now.Subtract(value).Ticks));
if (timeSpan.Days > 0)
{
sb.AppendFormat("{0} {1}", timeSpan.Days,
(timeSpan.Days > 1) ? "days" : "day");
if (approximate) return sb.ToString() + suffix;
}
if (timeSpan.Hours > 0)
{
sb.AppendFormat("{0}{1} {2}", (sb.Length > 0) ? ", " : string.Empty,
timeSpan.Hours, (timeSpan.Hours > 1) ? "hours" : "hour");
if (approximate) return sb.ToString() + suffix;
}
if (timeSpan.Minutes > 0)
{
sb.AppendFormat("{0}{1} {2}", (sb.Length > 0) ? ", " : string.Empty,
timeSpan.Minutes, (timeSpan.Minutes > 1) ? "minutes" : "minute");
if (approximate) return sb.ToString() + suffix;
}
if (timeSpan.Seconds > 0)
{
sb.AppendFormat("{0}{1} {2}", (sb.Length > 0) ? ", " : string.Empty,
timeSpan.Seconds, (timeSpan.Seconds > 1) ? "seconds" : "second");
if (approximate) return sb.ToString() + suffix;
}
if (sb.Length == 0) return "right now";
sb.Append(suffix);
return sb.ToString();
}
Если бы это было соглашение, я бы хотел, чтобы это было:
Я обычно добавляю к файлам конфигурации Spring префикс «spring», чтобы было более очевидно, для чего они используются, но это не обязательно обязательно.
Для проекта Web MVC я обычно разбиваю различные файлы контекста по линиям ответственности:
appname-dao.xml
appname-servlet.xml
appname -services.xml
appname-security.xml
Либо верблюжий регистр, либо разделенный '-' будут работать нормально, если вы будете последовательны. Я знаю, что в нашем случае мы не помещаем файлы контекста в тот же каталог, что и код, если только сам код не поддерживает Spring, а в нашем случае это не так.
У нас есть два случая для этого, когда мы используем maven 2, файл контекста находится в каталоге ресурсов / Spring, где ресурс является родственником исходного каталога java. Там, где используется maven 1, мы просто создаем корневой пакет Spring и помещаем туда контекст. Оба эти случая предполагают «обычный» Java-код. В случае пакетов Wars, EJB и OSGi файлы обычно находятся в каталоге meta-inf.
Кроме того, мы не используем контекст приложения верхнего уровня, чтобы «собрать» все вместе. Мы просто создаем контекст с несколькими файлами контекста. Мы считаем, что это намного проще для тестирования различными способами: модульных тестов с фиктивными объектами, интеграционных тестов без сервера и полных интеграционных тестов, развернутых на сервере. Во всех этих сценариях просто измените конфигурацию создания контекста вместо того, чтобы иметь «главный» контекст для каждого сценария.