TDateTime To ShortDateString в спутниковых формах "VB-клон" - PullRequest
0 голосов
/ 21 апреля 2011

Я пытаюсь найти вычисление, которое преобразует значение TDateTime 40653.6830593 в год, месяц, день, час, минуту и ​​секунду.

Я уверен, что это возможно, изКонечно, но мой мозг не способен написать формулу, которая будет извлекать эти значения из этого двойного числа.

Я использую Satellite Forms, язык, похожий на vb, но нея не ожидаю, что для этого мне понадобятся какие-то конкретные библиотеки .NET, верно?Это должен быть просто числовой расчет ... верно?

Спасибо за помощь!Искренне.

Джо

Ответы [ 3 ]

2 голосов
/ 21 апреля 2011

На основе вашего тега 'Delphi' ...

In Delphi

implementation

uses DateUtils;

....    
var
  MyDate: TDateTime;
  ...other vars...
begin
  MyDate:= double(40653.6830593);
  MyYear:= YearOf(MyDate);
  MyMonth:= MonthOf(MyDate);
  MyDay:= DayOf(MyDate);
  MyHour:= HourOf(MyDate);
  MyMinute:= ... ah well you get the idea.

Кстати: VB или Delphi, что это?

Если вы хотите бросить свой собственный

Из устройства sysutils (выпущено по двойной лицензии GPL2 / Borland Нет глупостей)
Что вы можете найти по адресу: http://www.koders.com/delphi/fidF6715D3FD1D4A92BA7F29F96643D8E9D11C1089F.aspx?s=hook

function DecodeDateFully(const DateTime: TDateTime; var Year, Month, Day, DOW: Word): Boolean;
const
  D1 = 365;
  D4 = D1 * 4 + 1;
  D100 = D4 * 25 - 1;
  D400 = D100 * 4 + 1;
var
  Y, M, D, I: Word;
  T: Integer;
  DayTable: PDayTable;
begin
  T := DateTimeToTimeStamp(DateTime).Date;
  if T <= 0 then
  begin
    Year := 0;
    Month := 0;
    Day := 0;
    DOW := 0;
    Result := False;
  end else
  begin
    DOW := T mod 7 + 1;
    Dec(T);
    Y := 1;
    while T >= D400 do
    begin
      Dec(T, D400);
      Inc(Y, 400);
    end;
    DivMod(T, D100, I, D);
    if I = 4 then
    begin
      Dec(I);
      Inc(D, D100);
    end;
    Inc(Y, I * 100);
    DivMod(D, D4, I, D);
    Inc(Y, I * 4);
    DivMod(D, D1, I, D);
    if I = 4 then
    begin
      Dec(I);
      Inc(D, D1);
    end;
    Inc(Y, I);
    Result := IsLeapYear(Y);
    DayTable := @MonthDays[Result];
    M := 1;
    while True do
    begin
      I := DayTable^[M];
      if D < I then Break;
      Dec(D, I);
      Inc(M);
    end;
    Year := Y;
    Month := M;
    Day := D + 1;
  end;
end;


function IsLeapYear(Year: Word): Boolean;
begin
  Result := (Year mod 4 = 0) and ((Year mod 100 <> 0) or (Year mod 400 = 0));
end;

function TryEncodeDate(Year, Month, Day: Word; out Date: TDateTime): Boolean;
var
  I: Integer;
  DayTable: PDayTable;
begin
  Result := False;
  DayTable := @MonthDays[IsLeapYear(Year)];
  if (Year >= 1) and (Year <= 9999) and (Month >= 1) and (Month <= 12) and
    (Day >= 1) and (Day <= DayTable^[Month]) then
  begin
    for I := 1 to Month - 1 do Inc(Day, DayTable^[I]);
    I := Year - 1;
    Date := I * 365 + I div 4 - I div 100 + I div 400 + Day - DateDelta;
    Result := True;
  end;
end;
1 голос
/ 21 апреля 2011

В старых версиях VB или VBA (даже в Excel) Date будет считаться числом дней с 30.12.1899, и я считаю, что то же самое верно и для Delphi. Таким образом, в устаревшем VB / VBA вы могли бы написать

Dim myDate as Date
myDate = myDate + 40653.68303593

Чтобы получить 20 апреля 2011 года 16:23:36. В VB.NET все по-другому, так как структура DateTime по умолчанию равна 1 января 0001.

Dim myDate As New DateTime(1899, 12, 30)
myDate = myDate.AddDays(40653.68303593)

Другой пользователь уже опубликовал ответ Delphi.

Во всяком случае, основная предпосылка заключается в том, что вы добавляете количество дней с десятичной частью, представляющей время. Таким образом, в этом примере с 30.12.1999 прошло 40653 полных дня и 0,683 ... неполных дня.

0 голосов
/ 21 апреля 2011

Для извлечения Часы:

запомните 1,0 = 1 день = 24 часа, таким образом

DayPart:= double(MyDateTime) - Floor(double(MyDateTime));    
//there is a function for fraction, but I forgot the name, 
//never use that stuff. 

//if we want to round 0.9999999999 up from 23:59:59 to 24:00:00, do this:
if (RoundTimeUpByHalfASecond = true) then DayPart:= DayPart + (1/(24*60*60*2));

hours:= floor(DayPart*24);
minutes:= floor(DayPart*24*60) mod 60; 
seconds:= minutes:= floor(DayPart*24*60*60) mod 60;

Надежда, которая помогает

...