В Windows Server 2012 R2 у меня возникли проблемы с учетной записью пользователя
psexec -u administrator -p password \\machinename -h -s -d -accepteula cmd.exe
. Но она работает нормально, если вы запускаете без параметров -h -s
. Вот почему я использую это, чтобы решить мою проблему:
psexec -accepteula -u administrator -p password \\machinename %PathToLocalUtils%\psexec.exe -h -s -d cmd.exe
Легкое для понимания и простое решение.
// Save today's date.
var today = DateTime.Today;
// Calculate the age.
var age = today.Year - birthdate.Year;
// Go back to the year the person was born in case of a leap year
if (birthdate.Date > today.AddYears(-age)) age--;
Однако это предполагает, что Вы ищете западный идея возраста и не используете житель Восточной Азии, считающий .
Лучший способ, о котором я знаю из-за високосных годов и все:
DateTime birthDate = new DateTime(2000,3,1);
int age = (int)Math.Floor((DateTime.Now - birthDate).TotalDays / 365.25D);
Hope это помогает.
Мое предложение
int age = (int) ((DateTime.Now - bday).TotalDays/365.242199);
, Которое, кажется, имеет год, изменяясь в правильную дату. (Я определяю протестированный до возраста 107)
Я создал Пользователя SQL Server Определенная Функция для вычисления чьего-то возраста, учитывая их дату рождения. Это полезно при необходимости в нем как в части запроса:
using System;
using System.Data;
using System.Data.Sql;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
public partial class UserDefinedFunctions
{
[SqlFunction(DataAccess = DataAccessKind.Read)]
public static SqlInt32 CalculateAge(string strBirthDate)
{
DateTime dtBirthDate = new DateTime();
dtBirthDate = Convert.ToDateTime(strBirthDate);
DateTime dtToday = DateTime.Now;
// get the difference in years
int years = dtToday.Year - dtBirthDate.Year;
// subtract another year if we're before the
// birth day in the current year
if (dtToday.Month < dtBirthDate.Month || (dtToday.Month == dtBirthDate.Month && dtToday.Day < dtBirthDate.Day))
years=years-1;
int intCustomerAge = years;
return intCustomerAge;
}
};
Это - странный способ сделать это, но если Вы форматируете дату к yyyymmdd
и вычитаете дату рождения из текущей даты, тогда отбрасывают последние 4 цифры, у Вас есть возраст:)
я не знаю C#, но я полагаю, что это будет работать на любом языке.
20080814 - 19800703 = 280111
Отбрасывание последние 4 цифры = 28
.
Код C#:
int now = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
int dob = int.Parse(dateOfBirth.ToString("yyyyMMdd"));
int age = (now - dob) / 10000;
Или альтернативно без всего преобразования типов в форме дополнительного метода. Проверка ошибок опустила:
public static Int32 GetAge(this DateTime dateOfBirth)
{
var today = DateTime.Today;
var a = (today.Year * 100 + today.Month) * 100 + today.Day;
var b = (dateOfBirth.Year * 100 + dateOfBirth.Month) * 100 + dateOfBirth.Day;
return (a - b) / 10000;
}
Другая функция, не мной, но найденный в сети и усовершенствованный это немного:
public static int GetAge(DateTime birthDate)
{
DateTime n = DateTime.Now; // To avoid a race condition around midnight
int age = n.Year - birthDate.Year;
if (n.Month < birthDate.Month || (n.Month == birthDate.Month && n.Day < birthDate.Day))
age--;
return age;
}
Всего две вещи, которые входят в мой ум: Что относительно людей из стран, которые не используют григорианский календарь? DateTime. Теперь находится в определенной для сервера культуре, я думаю. У меня есть абсолютно 0 знаний о фактическом работании с азиатскими календарями, и я не знаю, существует ли простой способ преобразовать даты между календарями, но на всякий случай Вы задаетесь вопросом о тех китайских парнях с 4660 года:-)
Я не думаю, что любой из ответов до сих пор предусматривает культуры, которые вычисляют возраст по-другому. Посмотрите, например, восточноазиатский Возраст, Считающий по сравнению с этим на Западе.
Любой реальный ответ должен включать локализацию. Стратегическая модель , вероятно, была бы в порядке в этом примере.
Я думаю, что TimeSpan имеет все, в чем мы нуждаемся в нем, не имея необходимость обращаться к 365,25 (или любое другое приближение). Подробно останавливаясь на примере в августе:
DateTime myBD = new DateTime(1980, 10, 10);
TimeSpan difference = DateTime.Now.Subtract(myBD);
textBox1.Text = difference.Years + " years " + difference.Months + " Months " + difference.Days + " days";
Это - версия, которую мы используем здесь. Это работает, и это довольно просто. Это - та же идея как Jeff, но я думаю, что это немного более ясно, потому что это выделяет логику для вычитания того, таким образом, немного легче понять.
public static int GetAge(this DateTime dateOfBirth, DateTime dateAsAt)
{
return dateAsAt.Year - dateOfBirth.Year - (dateOfBirth.DayOfYear < dateAsAt.DayOfYear ? 0 : 1);
}
Вы могли развернуть тернарный оператор для создания его еще более ясным, если Вы думаете, что такая вещь неясна.
, Очевидно, это сделано как дополнительный метод на DateTime
, но ясно можно захватить ту одну строку кода, который делает работу и помещает ее где угодно. Здесь у нас есть другая перегрузка Дополнительного метода, который передает в DateTime.Now
, только для полноты.
Я опаздываю на вечеринку, но вот краткое описание:
int age = new DateTime(DateTime.Now.Subtract(birthday).Ticks).Year-1;
Я потратил некоторое время, работая над этим, и придумал это, чтобы вычислить чей-то возраст в годах, месяцах и днях. Я тестировал проблему 29 февраля и високосные годы, и, похоже, это сработало, я был бы признателен за любые отзывы:
public void LoopAge(DateTime myDOB, DateTime FutureDate)
{
int years = 0;
int months = 0;
int days = 0;
DateTime tmpMyDOB = new DateTime(myDOB.Year, myDOB.Month, 1);
DateTime tmpFutureDate = new DateTime(FutureDate.Year, FutureDate.Month, 1);
while (tmpMyDOB.AddYears(years).AddMonths(months) < tmpFutureDate)
{
months++;
if (months > 12)
{
years++;
months = months - 12;
}
}
if (FutureDate.Day >= myDOB.Day)
{
days = days + FutureDate.Day - myDOB.Day;
}
else
{
months--;
if (months < 0)
{
years--;
months = months + 12;
}
days +=
DateTime.DaysInMonth(
FutureDate.AddMonths(-1).Year, FutureDate.AddMonths(-1).Month
) + FutureDate.Day - myDOB.Day;
}
//add an extra day if the dob is a leap day
if (DateTime.IsLeapYear(myDOB.Year) && myDOB.Month == 2 && myDOB.Day == 29)
{
//but only if the future date is less than 1st March
if (FutureDate >= new DateTime(FutureDate.Year, 3, 1))
days++;
}
}
Вот решение.
DateTime dateOfBirth = new DateTime(2000, 4, 18);
DateTime currentDate = DateTime.Now;
int ageInYears = 0;
int ageInMonths = 0;
int ageInDays = 0;
ageInDays = currentDate.Day - dateOfBirth.Day;
ageInMonths = currentDate.Month - dateOfBirth.Month;
ageInYears = currentDate.Year - dateOfBirth.Year;
if (ageInDays < 0)
{
ageInDays += DateTime.DaysInMonth(currentDate.Year, currentDate.Month);
ageInMonths = ageInMonths--;
if (ageInMonths < 0)
{
ageInMonths += 12;
ageInYears--;
}
}
if (ageInMonths < 0)
{
ageInMonths += 12;
ageInYears--;
}
Console.WriteLine("{0}, {1}, {2}", ageInYears, ageInMonths, ageInDays);
I don't know how the wrong solution can be accepted. Правильный фрагмент кода C # был написан Майклом Стумом
Вот тестовый фрагмент:
DateTime bDay = new DateTime(2000, 2, 29);
DateTime now = new DateTime(2009, 2, 28);
MessageBox.Show(string.Format("Test {0} {1} {2}",
CalculateAgeWrong1(bDay, now), // outputs 9
CalculateAgeWrong2(bDay, now), // outputs 9
CalculateAgeCorrect(bDay, now), // outputs 8
CalculateAgeCorrect2(bDay, now))); // outputs 8
Вот вам методы:
public int CalculateAgeWrong1(DateTime birthDate, DateTime now)
{
return new DateTime(now.Subtract(birthDate).Ticks).Year - 1;
}
public int CalculateAgeWrong2(DateTime birthDate, DateTime now)
{
int age = now.Year - birthDate.Year;
if (now < birthDate.AddYears(age))
age--;
return age;
}
public int CalculateAgeCorrect(DateTime birthDate, DateTime now)
{
int age = now.Year - birthDate.Year;
if (now.Month < birthDate.Month || (now.Month == birthDate.Month && now.Day < birthDate.Day))
age--;
return age;
}
public int CalculateAgeCorrect2(DateTime birthDate, DateTime now)
{
int age = now.Year - birthDate.Year;
// for leap years we need this
if (birthDate > now.AddYears(-age)) age--;
// don't use:
// if (birthDate.AddYears(age) > now) age--;
return age;
}
Я использую это:
public static class DateTimeExtensions
{
public static int Age(this DateTime birthDate)
{
return Age(birthDate, DateTime.Now);
}
public static int Age(this DateTime birthDate, DateTime offsetDate)
{
int result=0;
result = offsetDate.Year - birthDate.Year;
if (offsetDate.DayOfYear < birthDate.DayOfYear)
{
result--;
}
return result;
}
}
Сохранение простоты (и, возможно, глупости :)).
DateTime birth = new DateTime(1975, 09, 27, 01, 00, 00, 00);
TimeSpan ts = DateTime.Now - birth;
Console.WriteLine("You are approximately " + ts.TotalSeconds.ToString() + " seconds old.");
Будет ли это работать?
public override bool IsValid(DateTime value)
{
_dateOfBirth = value;
var yearsOld = (double) (DateTime.Now.Subtract(_dateOfBirth).TotalDays/365);
if (yearsOld > 18)
return true;
return false;
}
I've created an Age struct, which looks like this:
public struct Age : IEquatable<Age>, IComparable<Age>
{
private readonly int _years;
private readonly int _months;
private readonly int _days;
public int Years { get { return _years; } }
public int Months { get { return _months; } }
public int Days { get { return _days; } }
public Age( int years, int months, int days ) : this()
{
_years = years;
_months = months;
_days = days;
}
public static Age CalculateAge( DateTime dateOfBirth, DateTime date )
{
// Here is some logic that ressembles Mike's solution, although it
// also takes into account months & days.
// Ommitted for brevity.
return new Age (years, months, days);
}
// Ommited Equality, Comparable, GetHashCode, functionality for brevity.
}
Вот небольшой пример кода для C #, который я придумал, будьте осторожны с крайними случаями, особенно високосными годами, не все вышеперечисленные решения принимают их во внимание. Выдвижение ответа как DateTime может вызвать проблемы, так как вы можете в конечном итоге попытаться поместить слишком много дней в конкретный месяц, например, 30 дней в феврале.
public string LoopAge(DateTime myDOB, DateTime FutureDate)
{
int years = 0;
int months = 0;
int days = 0;
DateTime tmpMyDOB = new DateTime(myDOB.Year, myDOB.Month, 1);
DateTime tmpFutureDate = new DateTime(FutureDate.Year, FutureDate.Month, 1);
while (tmpMyDOB.AddYears(years).AddMonths(months) < tmpFutureDate)
{
months++;
if (months > 12)
{
years++;
months = months - 12;
}
}
if (FutureDate.Day >= myDOB.Day)
{
days = days + FutureDate.Day - myDOB.Day;
}
else
{
months--;
if (months < 0)
{
years--;
months = months + 12;
}
days = days + (DateTime.DaysInMonth(FutureDate.AddMonths(-1).Year, FutureDate.AddMonths(-1).Month) + FutureDate.Day) - myDOB.Day;
}
//add an extra day if the dob is a leap day
if (DateTime.IsLeapYear(myDOB.Year) && myDOB.Month == 2 && myDOB.Day == 29)
{
//but only if the future date is less than 1st March
if(FutureDate >= new DateTime(FutureDate.Year, 3,1))
days++;
}
return "Years: " + years + " Months: " + months + " Days: " + days;
}