不能获取文件的正确日期时间

以下内容存为 n_cst_filesrv.sru,导入后调用
n_cst_filesrv inv_filesrv
date ld_BarCodeAutoPrintdate
time lt_BarCodeAutoPrinttime
inv_filesrv = create n_cst_filesrv
inv_filesrv.of_getlastwritedatetime( 'c:\a.txt', ld_BarCodeAutoPrintdate , lt_BarCodeAutoPrinttime )
ld_BarCodeAutoPrintdate返回总是1900-01-01
lt_BarCodeAutoPrinttime =00:00:00
不能正确返回具体的日期时间,在网上找到其他类似的n_cst_filetime 也是一样。但同样是在pfc中调用的又正常


$PBExportHeader$n_cst_filesrv.sru
forward
global type n_cst_filesrv from nonvisualobject
end type
type os_filedatetime from structure within n_cst_filesrv
end type
type os_fileopeninfo from structure within n_cst_filesrv
end type
type os_finddata from structure within n_cst_filesrv
end type
type os_securityattributes from structure within n_cst_filesrv
end type
type os_systemtime from structure within n_cst_filesrv
end type
end forward

type os_filedatetime from structure
unsignedlong ul_lowdatetime
unsignedlong ul_highdatetime
end type

type os_fileopeninfo from structure
character c_length
character c_fixed_disk
unsignedinteger ui_dos_error
unsignedinteger ui_na1
unsignedinteger ui_na2
character c_pathname[128]
end type

type os_finddata from structure
unsignedlong ul_fileattributes
os_filedatetime str_creationtime
os_filedatetime str_lastaccesstime
os_filedatetime str_lastwritetime
unsignedlong ul_filesizehigh
unsignedlong ul_filesizelow
unsignedlong ul_reserved0
unsignedlong ul_reserved1
character ch_filename[260]
character ch_alternatefilename[14]
end type

type os_securityattributes from structure
unsignedlong ul_length
string ch_description
boolean b_inherit
end type

type os_systemtime from structure
unsignedinteger ui_wyear
unsignedinteger ui_wmonth
unsignedinteger ui_wdayofweek
unsignedinteger ui_wday
unsignedinteger ui_whour
unsignedinteger ui_wminute
unsignedinteger ui_wsecond
unsignedinteger ui_wmilliseconds
end type

global type n_cst_filesrv from nonvisualobject
end type
global n_cst_filesrv n_cst_filesrv

type prototypes
// Win 32 calls
Function ulong GetDriveTypeA (string drive) library "KERNEL32.DLL"
Function boolean CreateDirectoryA (ref string directoryname, ref os_securityattributes secattr) library "KERNEL32.DLL"
Function boolean RemoveDirectoryA (ref string directoryname) library "KERNEL32.DLL"
Function ulong GetCurrentDirectoryA (ulong textlen, ref string dirtext) library "KERNEL32.DLL"
Function boolean SetCurrentDirectoryA (ref string directoryname ) library "KERNEL32.DLL"
Function ulong GetFileAttributesA (ref string filename) library "KERNEL32.DLL"
Function boolean SetFileAttributesA (ref string filename, ulong attrib) library "KERNEL32.DLL"
Function boolean MoveFileA (ref string oldfile, ref string newfile) library "KERNEL32.DLL"
Function long FindFirstFileA (ref string filename, ref os_finddata findfiledata) library "KERNEL32.DLL"
Function boolean FindNextFileA (long handle, ref os_finddata findfiledata) library "KERNEL32.DLL"
Function boolean FindClose (long handle) library "KERNEL32.DLL"
Function boolean GetDiskFreeSpaceA (string drive, ref long sectpercluster, ref long bytespersect, ref long freeclusters, ref long totalclusters) library "KERNEL32.DLL"
Function long GetLastError() library "KERNEL32.DLL"

// Win32 calls for file date and time
Function long OpenFile (ref string filename, ref os_fileopeninfo of_struct, ulong action) LIBRARY "KERNEL32.DLL"
Function boolean CloseHandle (long file_hand) LIBRARY "KERNEL32.DLL"
Function boolean GetFileTime(long hFile, ref os_filedatetime  lpCreationTime, ref os_filedatetime  lpLastAccessTime, ref os_filedatetime  lpLastWriteTime  )  library "KERNEL32.DLL"
Function boolean FileTimeToSystemTime(ref os_filedatetime lpFileTime, ref os_systemtime lpSystemTime) library "KERNEL32.DLL"
Function boolean FileTimeToLocalFileTime(ref os_filedatetime lpFileTime, ref os_filedatetime lpLocalFileTime) library "KERNEL32.DLL"
Function boolean SetFileTime(long hFile, os_filedatetime  lpCreationTime, os_filedatetime  lpLastAccessTime, os_filedatetime  lpLastWriteTime  )  library "KERNEL32.DLL"
Function boolean SystemTimeToFileTime(os_systemtime lpSystemTime, ref os_filedatetime lpFileTime) library "KERNEL32.DLL"
Function boolean LocalFileTimeToFileTime(ref os_filedatetime lpLocalFileTime, ref os_filedatetime lpFileTime) library "KERNEL32.DLL"

end prototypes

type variables
Protected:
string is_Separator
string is_AllFiles
end variables

forward prototypes
    public function integer of_setlastwritedatetime (string as_filename, datetime adt)
    private function integer of_convertpbdatetimetofile (datetime adt, ref os_filedatetime astr_filetime)
public function integer of_fileread (string as_filename, ref string as_text[])
private function integer of_convertfiledatetimetopb (os_filedatetime astr_filetime, ref date ad_filedate, ref time at_filetime)
public function integer of_getcreatedatetime (string as_filename, ref date ad_date, ref time at_time)
public function integer of_getlastwritedatetime (string as_filename, ref date ad_date, ref time at_time)
end prototypes

    public function integer of_setlastwritedatetime (string as_filename, datetime adt);//设置文件最后修改时间
    boolean lb_Ret
    long ll_handle
    os_filedatetime lstr_FileTime, lstr_Empty
    os_finddata lstr_FindData
    os_fileopeninfo lstr_FileInfo
    // Get the file information.
    // This is required to keep the Last Access date from changing.
    // It will be changed by the OpenFile function.
    ll_handle = FindFirstFileA(as_FileName, lstr_FindData)
    If ll_handle <= 0 Then Return -1
    FindClose(ll_handle)
    // Convert the date and time
    If of_ConvertPBDatetimeToFile(adt, lstr_FileTime) < 0 Then Return -1
    // Set the file structure information
    lstr_FileInfo.c_fixed_disk = "~000"
    lstr_FileInfo.c_pathname = as_FileName
    lstr_FileInfo.c_length = "~142"
    // Open the file
    ll_handle = OpenFile ( as_filename, lstr_FileInfo, 2 )
    If ll_handle < 1 Then Return -1
    lb_Ret = SetFileTime(ll_handle, lstr_Empty, lstr_FindData.str_LastAccessTime, lstr_FileTime)
    CloseHandle(ll_handle)
    If lb_Ret Then
    Return 1
    Else
    Return -1
    End If
    end function

    private function integer of_convertpbdatetimetofile (datetime adt, ref os_filedatetime astr_filetime);//转换文件系统时间为PB时间
    os_filedatetime   lstr_LocalTime
    os_systemtime   lstr_SystemTime
    lstr_SystemTime.ui_wyear = year(date(adt))
    lstr_SystemTime.ui_WMonth = Month(date(adt))
    lstr_SystemTime.ui_WDay = Day(date(adt))
    lstr_SystemTime.ui_wHour = hour(time(adt))
    lstr_SystemTime.ui_wMinute = Minute(time(adt))
    lstr_SystemTime.ui_wSecond = Second(time(adt))
    lstr_SystemTime.ui_wMilliseconds = Long(String(adt, "fff"))
    If Not SystemTimeToFileTime(lstr_SystemTime, lstr_LocalTime) Then Return -1
    If Not LocalFileTimeToFileTime(lstr_LocalTime, astr_FileTime) Then Return -1
    Return 1
    end function

public function integer of_fileread (string as_filename, ref string as_text[]);
integer li_FileNo, li_Cnt
long ll_FileLen, ll_Reads

ll_FileLen = FileLength(as_FileName)

li_FileNo = FileOpen(as_FileName, StreamMode!, Read!)



If li_FileNo < 0 Then Return -1

// Determine the number of reads required to read the entire file
If ll_FileLen > 32765 Then
If Mod(ll_FileLen, 32765) = 0 Then
ll_Reads = ll_FileLen / 32765
Else
ll_Reads = (ll_FileLen / 32765) + 1
End if
Else
ll_Reads = 1
End if

For li_Cnt = 1 to ll_Reads
If FileRead(li_FileNo, as_Text[li_Cnt]) = -1 Then
Return -1
End if
Next

FileClose(li_FileNo)

Return ll_Reads
end function

private function integer of_convertfiledatetimetopb (os_filedatetime astr_filetime, ref date ad_filedate, ref time at_filetime);string ls_Time
os_filedatetime lstr_LocalTime
os_systemtime lstr_SystemTime


If Not FileTimeToLocalFileTime(astr_FileTime, lstr_LocalTime) Then Return -1

If Not FileTimeToSystemTime(lstr_LocalTime, lstr_SystemTime) Then Return -1


// works with all date formats
ad_FileDate = Date(lstr_SystemTime.ui_wyear, lstr_SystemTime.ui_WMonth, lstr_SystemTime.ui_WDay)

ls_Time = String(lstr_SystemTime.ui_wHour) + ":" + &
 String(lstr_SystemTime.ui_wMinute) + ":" + &
 String(lstr_SystemTime.ui_wSecond) + ":" + &
 String(lstr_SystemTime.ui_wMilliseconds)
at_FileTime = Time(ls_Time)

Return 1
end function

public function integer of_getcreatedatetime (string as_filename, ref date ad_date, ref time at_time);//得到文件创建的时间
    long ll_handle
    os_finddata   lstr_FindData
    // Get the file information
    ll_handle = FindFirstFileA(as_FileName, lstr_FindData)
    If ll_handle <= 0 Then Return -1
    FindClose(ll_handle)
    // Convert the date and time
    Return of_ConvertFileDatetimeToPB(lstr_FindData.str_CreationTime, ad_Date ,at_Time )
   
end function

public function integer of_getlastwritedatetime (string as_filename, ref date ad_date, ref time at_time);//得到文件最后修改的时间
long ll_handle
os_finddata lstr_FindData

// Get the file information
ll_handle = FindFirstFileA(as_FileName, lstr_FindData)



If ll_handle <= 0 Then Return -1
FindClose(ll_handle)

// Convert the date and time
Return of_ConvertFileDatetimeToPB(lstr_FindData.str_CreationTime, ad_Date, at_Time)
end function

on n_cst_filesrv.create
call super::create
TriggerEvent( this, "constructor" )
end on

on n_cst_filesrv.destroy
TriggerEvent( this, "destructor" )
call super::destroy
end on

event constructor;is_Separator = "\"
is_AllFiles = "*.*"
end event

回答: 不能获取文件的正确日期时间

  1. 用FileSystemObject比较简单

如何获取文件的修改日期

  1. Q
  2. A
    /* 在SQL Server中取得操作系统文件的最后修改日期a
      获取文件最后访问日期
      @filepath   文件路径,如:   c:\1.txt
      @filedate   文件最后访问日期

      调用示例:
      declare   @dt   varchar(20)
      exec   getFileLastAccessDate   'c:\1.txt',@dt   output
      select   @dt
    */
    create   procedure   getFileLastAccessDate
      @filepath   varchar(4000),
      @filedate   varchar(20)   output
    as
      declare   @obj   int,@file   int
      declare   @fileexists   varchar(10)
      exec   sp_oacreate   'Scripting.FileSystemObject',@obj   output
      exec   sp_oamethod   @obj,'FileExists',@fileexists   output,@filepath
      if   @fileexists='False'
      begin
        set   @filedate='文件不存在'
        return
      end
      exec   sp_oamethod   @obj,'GetFile',@file   output,@filepath
      exec   sp_oagetproperty   @file,'DateLastAccessed',@filedate   output
    go
    /*
      获取文件最后修改日期
      @filepath   文件路径,如:   c:\1.txt
      @filedate   文件最后修改日期

      调用示例:
      declare   @dt   varchar(20)
      exec   getFileLastModified   'c:\1.txt',@dt   output
      select   @dt
    */
    create procedure getFileLastModified
      @filepath varchar(4000),
      @filedate varchar(20) output
    as
      declare   @obj   int,@file   int
      declare   @fileexists   varchar(10)
      exec   sp_oacreate   'Scripting.FileSystemObject',@obj   output
      exec   sp_oamethod   @obj,'FileExists',@fileexists   output,@filepath
      if   @fileexists='False'
      begin
        set   @filedate='文件不存在'
        return
      end
      exec   sp_oamethod   @obj,'GetFile',@file   output,@filepath
      exec   sp_oagetproperty   @file,'DateLastModified',@filedate   output
    go

关于如何获取文件修改日期的方法

  1. Q
    如题,我在网上找到的一种方法:

    string   filename= "C:\powerbuilder\PbApi\WinApi.txt " 
    ulong   hfile 
    long   rtn 
    WIN32_FIND_DATA   lpFindFileData 
    SYSTEMTIME   lpSystemTime 
    filetime   lpcreate 
    filetime   lpaccess 
    filetime   lpwrite 
    FILETIME   lpFileTime 
    FindFirstFile(filename,lpFindFileData) 
    lpFileTime   =   lpFindFileData.creationtime 

    rtn   =   FileTimeToSystemTime(lpFileTime,lpSystemTime) 
    Messagebox( "creationtime ",   string(lpSystemTime.wyear)+ "年 "+string(lpSystemTime.wmonth)+ "月 "+string(lpSystemTime.wday)+ "日 ") 


    相关结构: 
    $PBExportHeader$win32_find_data.srs 
    global   type   WIN32_FIND_DATA   from   structure 
    unsignedlong fileattributes 
    filetime creationtime 
    filetime lastaccesstime 
    filetime lastwritetime 
    unsignedlong filesizehigh 
    unsignedlong filesizelow 
    unsignedlong reserved0 
    unsignedlong reserved1 
    character filename[260] 
    character alternatefilename[14] 
    end   type 

    $PBExportHeader$filetime.srs 
    global   type   FILETIME   from   structure 
    ulong dwLowDateTime 
    ulong dwHighDateTime 
    end   type 

    $PBExportHeader$systemtime.srs 
    global   type   SYSTEMTIME   from   structure 
    uint wYear 
    uint wMonth 
    uint wDayOfWeek 
    uint wDay 
    uint wHour 
    uint wMinute 
    uint wSecond 
    uint wMilliseconds 
    end   type 

    函数定义 
    FUNCTION   ulong   FileTimeToSystemTime(ref   FILETIME   lpFileTime,ref   SYSTEMTIME   lpSystemTime)   LIBRARY   "kernel32.dll " 
    FUNCTION   ulong   FindFirstFile(ref   string   lpFileName,ref   WIN32_FIND_DATA   lpFindFileData)   LIBRARY   "kernel32.dll "   ALIAS   FOR   "FindFirstFileA "

    但是,运行时总是提示下面几行有问题:
    FILETIME   lpFileTime 
    FindFirstFile(filename,lpFindFileData) 
    lpFileTime   =   lpFindFileData.creationtime 

    rtn   =   FileTimeToSystemTime(lpFileTime,lpSystemTime) 

    问题出在什么地方,是否还有其它好的办法,请各位多多指教
  2. A
    建立一个userobject,命名为n_cst_liveupdate
    然后对该对象edit source ,将下面那些内容复制替换掉里面的内容,然后保存
    n_cst_liveupdate是一个取(和设置)本地文件最后修改日期的自定义对象

    forward
    global type n_cst_liveupdate from nonvisualobject
    end type
    type os_filedatetime from structure within n_cst_liveupdate
    end type
    type os_fileopeninfo from structure within n_cst_liveupdate
    end type
    type os_finddata from structure within n_cst_liveupdate
    end type
    type os_securityattributes from structure within n_cst_liveupdate
    end type
    type os_systemtime from structure within n_cst_liveupdate
    end type
    end forward

    type os_filedatetime from structure
        unsignedlong        ul_lowdatetime
        unsignedlong        ul_highdatetime
    end type

    type os_fileopeninfo from structure
        character        c_length
        character        c_fixed_disk
        unsignedinteger        ui_dos_error
        unsignedinteger        ui_na1
        unsignedinteger        ui_na2
        character        c_pathname[128]
    end type

    type os_finddata from structure
        unsignedlong        ul_fileattributes
        os_filedatetime        str_creationtime
        os_filedatetime        str_lastaccesstime
        os_filedatetime        str_lastwritetime
        unsignedlong        ul_filesizehigh
        unsignedlong        ul_filesizelow
        unsignedlong        ul_reserved0
        unsignedlong        ul_reserved1
        character        ch_filename[260]
        character        ch_alternatefilename[14]
    end type

    type os_securityattributes from structure
        unsignedlong        ul_length
        string        ch_description
        boolean        b_inherit
    end type

    type os_systemtime from structure
        unsignedinteger        ui_wyear
        unsignedinteger        ui_wmonth
        unsignedinteger        ui_wdayofweek
        unsignedinteger        ui_wday
        unsignedinteger        ui_whour
        unsignedinteger        ui_wminute
        unsignedinteger        ui_wsecond
        unsignedinteger        ui_wmilliseconds
    end type

    global type n_cst_liveupdate from nonvisualobject autoinstantiate
    end type

    type prototypes
    //获得应用程序名用
    //Function uint GetModuleFileNameA(ulong hModule,ref string lpFilename,ulong nSize) Library "kernel32.dll" //获取应用程序运行目录

    //文件操作
    Function long FindFirstFileA (ref string filename, ref os_finddata findfiledata) library "kernel32.dll"
    Function boolean FindNextFileA (long handle, ref os_finddata findfiledata) library "kernel32.dll"
    Function boolean FindClose (long handle) library "kernel32.dll"
    Function long    OpenFile (ref string filename, ref os_fileopeninfo of_struct, ulong action) LIBRARY "kernel32.dll"
    Function boolean CloseHandle (long file_hand) LIBRARY "kernel32.dll"
    Function boolean GetFileTime(long hFile, ref os_filedatetime  lpCreationTime, ref os_filedatetime  lpLastAccessTime, ref os_filedatetime  lpLastWriteTime  )  library "kernel32.dll"
    Function boolean FileTimeToSystemTime(ref os_filedatetime lpFileTime, ref os_systemtime lpSystemTime) library "kernel32.dll"
    Function boolean FileTimeToLocalFileTime(ref os_filedatetime lpFileTime, ref os_filedatetime lpLocalFileTime) library "kernel32.dll"
    Function boolean SetFileTime(long hFile, os_filedatetime  lpCreationTime, os_filedatetime  lpLastAccessTime, os_filedatetime  lpLastWriteTime  )  library "kernel32.dll"
    Function boolean SystemTimeToFileTime(os_systemtime lpSystemTime, ref os_filedatetime lpFileTime) library "kernel32.dll"
    Function boolean LocalFileTimeToFileTime(ref os_filedatetime lpLocalFileTime, ref os_filedatetime lpFileTime) library "kernel32.dll"

    end prototypes
    type variables

    end variables

    forward prototypes
    public function integer of_convertfiledatetimetopb (os_filedatetime astr_filetime, ref date ad_filedate, ref time at_filetime)
    public function integer of_convertpbdatetimetofile (date ad_filedate, time at_filetime, ref os_filedatetime astr_filetime)
    public function integer of_getcreatedatetime (string as_filename, ref date ad_date, ref time at_time)
    public function integer of_getlastwritedatetime (string as_filename, ref date ad_date, ref time at_time)
    public function integer of_setlastwritedatetime (string as_filename, date ad_date, time at_time)
    public function integer of_convertfiledatetimetopb (os_filedatetime astr_filetime, ref date ad_filedate, ref time at_filetime)
    public function integer of_convertpbdatetimetofile (date ad_filedate, time at_filetime, ref os_filedatetime astr_filetime)
    public function integer of_getcreatedatetime (string as_filename, ref date ad_date, ref time at_time)
    public function integer of_getlastwritedatetime (string as_filename, ref date ad_date, ref time at_time)
    public function integer of_setlastwritedatetime (string as_filename, date ad_date, time at_time)
    end prototypes

    public function integer of_convertfiledatetimetopb (os_filedatetime astr_filetime, ref date ad_filedate, ref time at_filetime);string                ls_Date, ls_Time
    os_filedatetime    lstr_LocalTime
    os_systemtime    lstr_SystemTime

    If Not FileTimeToLocalFileTime(astr_FileTime, lstr_LocalTime) Then Return -1

    If Not FileTimeToSystemTime(lstr_LocalTime, lstr_SystemTime) Then Return -1

    ls_Date = String(lstr_SystemTime.ui_wyear) + "/" + &
                 String(lstr_SystemTime.ui_WMonth) + "/" + &
                 String(lstr_SystemTime.ui_WDay)
    ad_FileDate = Date(ls_Date)

    ls_Time = String(lstr_SystemTime.ui_wHour) + ":" + &
                 String(lstr_SystemTime.ui_wMinute) + ":" + &
                 String(lstr_SystemTime.ui_wSecond) + ":" + &
                 String(lstr_SystemTime.ui_wMilliseconds)
    at_FileTime = Time(ls_Time)

    Return 1
    end function

    public function integer of_convertpbdatetimetofile (date ad_filedate, time at_filetime, ref os_filedatetime astr_filetime);//////////////////////////////////////////////////////////////////////////////
    //    Protected Function:  of_ConvertPBDatetimeToFile
    //    Arguments:        ad_FileDate            The file date in PowerBuilder Date format.
    //                        at_FileTime            The file time in PowerBuilder Time format.
    //                        astr_FileTime        The os_filedatetime structure to contain the system date/time for the file, passed by reference.
    //    Returns:            Integer
    //                        1 if successful, -1 if an error occurrs.
    //    Description:    Convert PowerBuilder Date and Time to the sytem file type.
    //////////////////////////////////////////////////////////////////////////////
    //    Rev. History:    Version
    //                        6.0   Initial version
    //                        6.0.01    Fix millisecond overflow.  Change size of string to 3 digits from 6 
    //////////////////////////////////////////////////////////////////////////////
    //    Copyright ?1996-1999 Sybase, Inc. and its subsidiaries.  All rights reserved.  Any distribution of the 
    // PowerBuilder Foundation Classes (PFC) source code by other than Sybase, Inc. and its subsidiaries is prohibited.
    //////////////////////////////////////////////////////////////////////////////
    string                ls_Date, ls_Time
    os_filedatetime    lstr_LocalTime
    os_systemtime    lstr_SystemTime

    ls_Date = String(ad_FileDate, "yyyy-mm-dd")
    lstr_SystemTime.ui_wyear = Long(Left(ls_Date, 4))
    lstr_SystemTime.ui_WMonth = Long(Mid(ls_Date, 6, 2))
    lstr_SystemTime.ui_WDay = Long(Right(ls_Date, 2))

    ls_Time = String(at_FileTime, "hh:mm:ss:fff")
    lstr_SystemTime.ui_wHour = Long(Left(ls_Time, 2))
    lstr_SystemTime.ui_wMinute = Long(Mid(ls_Time, 4, 2))
    lstr_SystemTime.ui_wSecond = Long(Mid(ls_Time, 7, 2))
    lstr_SystemTime.ui_wMilliseconds = Long(Right(ls_Time, 3))

    If Not SystemTimeToFileTime(lstr_SystemTime, lstr_LocalTime) Then Return -1

    If Not LocalFileTimeToFileTime(lstr_LocalTime, astr_FileTime) Then Return -1

    Return 1
    end function

    public function integer of_getcreatedatetime (string as_filename, ref date ad_date, ref time at_time);//得到文件创建的时间
    long ll_handle
    os_finddata    lstr_FindData

    // Get the file information
    ll_handle = FindFirstFileA(as_FileName, lstr_FindData)
    If ll_handle <= 0 Then Return -1
    FindClose(ll_handle)

    // Convert the date and time
    Return of_ConvertFileDatetimeToPB(lstr_FindData.str_CreationTime, ad_Date, at_Time)
    end function

    public function integer of_getlastwritedatetime (string as_filename, ref date ad_date, ref time at_time);//得到文件最后修改的时间
    long    ll_handle
    os_finddata    lstr_FindData

    // Get the file information
    ll_handle = FindFirstFileA(as_FileName, lstr_FindData)
    If ll_handle <= 0 Then Return -1
    FindClose(ll_handle)

    // Convert the date and time
    Return of_ConvertFileDatetimeToPB(lstr_FindData.str_LastWriteTime, ad_Date, at_Time)
    end function

    public function integer of_setlastwritedatetime (string as_filename, date ad_date, time at_time);boolean lb_Ret
    long ll_handle
    os_filedatetime lstr_FileTime, lstr_Empty
    os_finddata lstr_FindData
    os_fileopeninfo lstr_FileInfo

    // Get the file information.
    // This is required to keep the Last Access date from changing.
    // It will be changed by the OpenFile function.
    ll_handle = FindFirstFileA(as_FileName, lstr_FindData)
    If ll_handle <= 0 Then Return -1
    FindClose(ll_handle)

    // Convert the date and time
    If of_ConvertPBDatetimeToFile(ad_Date, at_Time, lstr_FileTime) < 0 Then Return -1

    // Set the file structure information
    lstr_FileInfo.c_fixed_disk = "~000"
    lstr_FileInfo.c_pathname = as_FileName
    lstr_FileInfo.c_length = "~142"

    // Open the file
    ll_handle = OpenFile ( as_filename, lstr_FileInfo, 2 ) 
    If ll_handle < 1 Then Return -1
     
    lb_Ret = SetFileTime(ll_handle, lstr_Empty, lstr_FindData.str_LastAccessTime, lstr_FileTime)

    CloseHandle(ll_handle)

    If lb_Ret Then
        Return 1
    Else
        Return -1
    End If

    end function

    on n_cst_liveupdate.create
    call super::create
    TriggerEvent( this, "constructor" )
    end on

    on n_cst_liveupdate.destroy
    TriggerEvent( this, "destructor" )
    call super::destroy
    end on



    调用方法为:

java文件中校验日期和时间格式,急求解答

  1. Q
    现在需要在java文件中校验日期是否符合yyyy-mm-dd格式并且为有效日期,也就是说不能出现0000-00-00这种的错误形式,请问有没有什么好办法?另外,还要校验时间格式,时间格式为 xx:xx:xx,时间不允许出现24:00:00这种情况。请问有没有对这方面比较牛的,麻烦给解答一下了java文件中校验日期和时间格式,急求解答
  2. A
    
    	static int[] DAYS = { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    
    	/**
    	 * @param date yyyy-MM-dd HH:mm:ss
    	 * @return
    	 */
    	public static boolean isValidDate(String date) {
    		try {
    			int year = Integer.parseInt(date.substring(0, 4));
    			if (year <= 0)
    				return false;
    			int month = Integer.parseInt(date.substring(5, 7));
    			if (month <= 0 || month > 12)
    				return false;
    			int day = Integer.parseInt(date.substring(8, 10));
    			if (day <= 0 || day > DAYS[month])
    				return false;
    			if (month == 2 && day == 29 && !isGregorianLeapYear(year)) {
    				return false;
    			}
    			int hour = Integer.parseInt(date.substring(11, 13));
    			if (hour < 0 || hour > 23)
    				return false;
    			int minute = Integer.parseInt(date.substring(14, 16));
    			if (minute < 0 || minute > 59)
    				return false;
    			int second = Integer.parseInt(date.substring(17, 19));
    			if (second < 0 || second > 59)
    				return false;
    
    		} catch (Exception e) {
    			e.printStackTrace();
    			return false;
    		}
    		return true;
    	}
    	public static final boolean isGregorianLeapYear(int year) {
    		return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0);
    	}
    	public static void main(String[] args) {
    		System.out.println(isValidDate("2100-02-29 23:00:01"));
    	}
    

DELPHI编写程序如何实现,运行时先获取Intel网络日期时间并修改本地日期时间

  1. Q
    DELPHI编写程序如何实现,运行时先获取Intel网络日期时间并修改本地日期时间
    DELPHI编写程序如何实现,运行时先获取Intel网络日期时间并修改本地日期时间

    大家出来聊聊吧
  2. A
    也可在线程中,获取时间成功后,修正本机时间值。成功返回真。

请问JAVA怎样获取压缩文件里子文件的最后修改时间?

  1. Q
    请问JAVA怎样获取压缩文件里子文件的最后修改时间?
    问题补充:
    注明:压缩文件的格式是 *.jar

    发现java.util.jar.ZipEntry 里面没有获取时间的方法呀
    问题补充:


    我用ZipFile试了一下,发现可以获取jar里面子文件的时间

    感谢RednaxelaFX ~!
  2. A
    如果你说的压缩文件是zip文件的话,那可以用java.util.zip包里的相关类。
    用ZipFile来打开zip文件,然后通过getEntry()方法得到子文件的ZipEntry,ZipEntry上的getTime()返回的就是文件的修改时间,类型是long。

    如果不是zip而是其它类型的压缩文件,那标准库里就没有直接处理的方法了。

powerbuilder12.5在windows7底下怎么获取文件的创建时间

  1. Q
    powerbuilder12.5在windows7底下怎么获取文件的创建时间。
    对应的api我也调用了,还是不行。搞了好久还是不行,在线等啊。
    openfile
    GetFileTime
    FileTimeToLocalFileTime
    FileTimeToLocalFileTime
    网上参考的代码:
    type FileTime from structure
     long  dwLowDateTime
     long  dwHighDateTime
    end type
     
    type OFSTRUCT from structure
     unsignedinteger  cBytes
     unsignedinteger  fFixedDisk
     integer  nErrCode
     integer  Reserved1
     integer  Reserved2
     integer  szPathName[128]
    end type
     
    type systemtime from structure
     integer  wYear
     integer  wMonth
     integer  wDayOfWeek
     integer  wDay
     integer  wHour
     integer  wMinute
     integer  wSecond
     integer  wMilliseconds
    end type
     
     
     
    定义API函数
     
    FUNCTION ulong GetFileTime(ulong hFile,ref FILETIME lpCreationTime,ref FILETIME lpLastAccessTime,ref FILETIME lpLastWriteTime) LIBRARY "kernel32.dll"
    FUNCTION ulong OpenFile(ref string lpFileName,ref OFSTRUCT lpReOpenBuff,ulong wStyle) LIBRARY "kernel32.dll" Alias For "OpenFile;Ansi"
    FUNCTION ulong FileTimeToSystemTime(ref FILETIME lpFileTime,ref SYSTEMTIME lpSystemTime) LIBRARY "kernel32.dll"
    Function ulong FileTimeToLocalFileTime(ref FILETIME lpFileTime ,ref FILETIME lpLocalFileTime ) LIBRARY "kernel32.dll"
     
    函数
     
    参数
     
    public function datetime of_getfiletime (string as_filename, integer ai_flag);ulong lul_hFile
    datetime ldt_time 
    string ls_time
     
    ofstruct lst_ofstruct
    systemtime lst_systemtime 
    filetime lst_filetime1,lst_filetime2,lst_filetime3,lst_filetime//分别是创建时间、访问时间、修改时间 

    if ai_flag < 1 or ai_flag > 3 then ai_flag = 3
    lul_hFile = openfile(as_filename,lst_ofstruct,0)//取句柄
     
    GetFileTime(lul_hFile,lst_filetime1,lst_filetime2,lst_filetime3)//取时间
    choose case ai_flag //将UTC格式转化成系统时间格式
     case 1//创建时间
    //  FileTimeToSystemTime(LST_FileTime1,LST_SYSTEMTIME)
      FileTimeToLocalFileTime(LST_FileTime1,lst_filetime) 
     case 2//访问时间
    //  FileTimeToSystemTime(LST_FileTime2,LST_SYSTEMTIME) 
      FileTimeToLocalFileTime(LST_FileTime2,lst_filetime) 
     case 3//修改时间
    //  FileTimeToSystemTime(LST_FileTime3,LST_SYSTEMTIME) 
      FileTimeToLocalFileTime(LST_FileTime3,lst_filetime) 
    end choose 
    FileTimeToSystemTime(lst_filetime,LST_SYSTEMTIME) 
    ls_time = string(lst_systemtime.wYear,'0000')+ '-'+string(lst_systemtime.wMonth,'00') + '-'+string(lst_systemtime.wDay,'00')+' '
    ls_time += string(lst_systemtime.wHour,'00')+ ':'+string(lst_systemtime.wMinute,'00') + ':'+string(lst_systemtime.wSecond,'00')
     

    ldt_time = m0_f_datetime(ls_time) //m0_f_开头的函数为我MBASE (MIS BASE FRAMEWORK)的基础函数,转换为时间
     
     
     
    return ldt_time
     
    end function
  2. A
    oleobject lole_f, lole_file
    lole_f = create oleobject
    if lole_f.ConnecttonewObject("Scripting.FileSystemObject") <> 0 then
    messagebox('提示', '无法连接!')
    return
    end if
    lole_file = lole_f.GetFile("D:\记账.xls")
    messagebox('文件信息',  "创建时间:" + string(lole_file.DateCreated) + "" + &
     "~r~n上次访问时间:" + string(lole_file.DateLastAccessed) + &
    "~r~n上次修改时间:" + string(lole_file.DateLastModified))

    lole_f.disconnectobject()
    destroy lole_f

日期/时间字段查询抛错——'对象关闭时,不允许操作。'

  1. Q
    Set dsuser = Server.CreateObject("ADODB.Recordset")  
    On Error Resume Next
    Sql="Select count(*) from wwwi_USER where regtime>=#"&date&"# "
    dsuser.Open Sql,conn,1,1
    dsuser.close

    上面的代码总是抛出错误——对象关闭时,不允许操作。
    如果把sql变量的值改成"Select count(*) from wwwi_USER where truename='"&usname&"'",就没有了错误,也就是改成非日期/时间类型字段做查询。

    高手请指点,该如何搞,先谢过了
  2. A
    SELECT * FROM wwwi_USER where regtime>=DateValue('2007/11/07')
    都会出错?
    建议你还是检查一下你的数据库里的表的字段类型是否正确吧.
    给你个demo:

    '******************************************************************************
    ' start...
    '******************************************************************************
        sDB = "csdn.mdb"
        sTable = "vbs"
        arr1 = Array("name","IQ","address","birth")
        arr2 = Array("TEXT(32)","INTEGER","TEXT(32)","DATETIME")
    On Error Resume Next

    '创建数据库文件
    Err.Clear
    CreateDBFile sDB
    If Err Then 
    WScript.Echo "创建数据库文件失败!" & vbCrLf & "原因:" & Err.Description 
    End If

    '创建表
    Err.Clear
    CreateTable sDB,sTable,arr1,arr2
    If Err Then 
    WScript.Echo "创建表失败!" & vbCrLf & "原因:" & Err.Description 
    End If

    '添加数据
    Err.Clear
    AddRecord
    If Err Then 
    WScript.Echo "添加数据失败!" & vbCrLf & "原因:" & Err.Description 
    End If

    '查询数据
    Err.Clear
    QueryRecord
    If Err Then 
    WScript.Echo "查询数据失败!" & vbCrLf & "原因:" & Err.Description 
    WScript.Quit
    End If

    'WScript.Echo "操作完成!"

    '******************************************************************************
    ' 创建数据库文件
    '******************************************************************************
    Sub CreateDBFile(strFileName)
    Set objConnection = CreateObject("ADOX.Catalog")
    objConnection.Create _
        "Provider = Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source = " & strFileName
    Set objConnection = Nothing
    End Sub
    '******************************************************************************
    ' 创建表
    '******************************************************************************
    Sub CreateTable(strDBFile,strTableName,arrName,arrType)

    Set objConnection = CreateObject("ADODB.Connection")
    objConnection.Open _
        "Provider= Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=" & strDBFile
        
    On Error Resume Next
    If UBound(arrName) <> UBound(arrType) Then 
    Err.Clear
    Err.Raise vbObjectError + 1
    Exit Sub
    End If
    str = "CREATE TABLE " & strTableName & "("
    For i = 0 To UBound(arrName) - 1
    str = str & arrName(i) & Space(1) & arrType(i) & ","
    Next
    str = str & arrName(UBound(arrName)) & Space(1) & arrType(UBound(arrType)) & ")"
    objConnection.Execute str

    objConnection.Close
    Set objConnection = Nothing
    End Sub
    '******************************************************************************
    '添加数据
    '******************************************************************************
    Sub AddRecord

    Set objConnection = CreateObject("ADODB.Connection")
    Set objRecordSet = CreateObject("ADODB.Recordset")

    objConnection.Open _
        "Provider = Microsoft.Jet.OLEDB.4.0; " & _
            "Data Source = " & sDB

    objRecordSet.Open "SELECT * FROM " & sTable ,objConnection,3,3

    objRecordSet.AddNew
    objRecordSet("name") = "凤姐"
    objRecordSet("IQ") = 250
    objRecordSet("address") = "www.mop.com"
    objRecordSet("birth") = DateValue("1985-09-23")
    objRecordSet.Update

    objRecordSet.AddNew
    objRecordSet("name") = "月月"
    objRecordSet("IQ") = 0
    objRecordSet("address") = "www.tianyaclub.com"
    objRecordSet("birth") = #1980/05/06#
    objRecordSet.Update

    objRecordSet.AddNew
    objRecordSet("name") = "芙蓉"
    objRecordSet("IQ") = 251
    objRecordSet("address") = "www.newsmth.net"
    objRecordSet("birth") = DateValue("1977/07/19")
    objRecordSet.Update

    objRecordSet.AddNew
    objRecordSet("name") = "李刚"
    objRecordSet("IQ") = 914
    objRecordSet("address") = "公共安全专家"
    objRecordSet("birth") = #1962-05-06#
    objRecordSet.Update

    objRecordSet.Close
    objConnection.Close
    Set objRecordSet = Nothing
    Set objConnection = Nothing

    End Sub

    '******************************************************************************
    '查询数据
    '******************************************************************************
    Sub QueryRecord

    Set objConnection = CreateObject("ADODB.Connection")
    Set objRecordSet = CreateObject("ADODB.Recordset")

    objConnection.Open _
        "Provider = Microsoft.Jet.OLEDB.4.0; " & _
            "Data Source = " & sDB

    ' objRecordSet.Open "SELECT * FROM " & sTable & _
    ' " WHERE birth < DateValue('1980-05-06')",objConnection
    objRecordSet.Open "SELECT * FROM " & sTable & _
    " WHERE birth <= #1980-05-06#",objConnection
    WScript.Echo "姓名" & vbTab & "IQ" & vbTab & "出处" & vbTab & _
     vbTab & "年月" & vbCrLf & objRecordSet.GetString


    objRecordSet.Close
    objConnection.Close
    Set objRecordSet = Nothing
    Set objConnection = Nothing

    End Sub
    '******************************************************************************
    'end.....
    '******************************************************************************

一个智能化的日期时间类CDateTimeEdit,大家看好用否?

  1. Q

    一个智能化的日期时间类CDateTimeEdit,大家看好用否?

    一个智能化的日期时间类CDateTimeEdit

    这个类虽然是从CEdit类继承,但做了日期时间的格式化规范,用户输入感觉到很方便,可以用左右键来移动选区,用上下键或滚轮来改变数字,也可直接输入。不会得到错误格式的日期时间格式。

    用GetDateTime(COleDateTime& dateSrc)来获取编辑框中的内容

    用SetDateTime(COleDateTime& dateSrc)来设置编辑框中的内容

    可以EnableWindow(BOOL bEnable)来允许或不允许用户操作。

    不会做OCX,如果做成OCX就更方便了。

    在界面上放一个CEdit控件,直接关联上这个类就可以用。

  2. A
    用户没有输入的时候,最好是空白,而不是    -  -     :  :  

如何统一access中的日期/时间类型与c++ builder中的日期/时间类型

  1. Q
    如何统一access中的日期/时间类型字段与c++ builder中的日期/时间类型,然后比较他们的大小。
    我要把到期的记录删除(把数据库里面的到期时间与当前日期进行比较),只精确到天。

      DateTime cEndTime =  FormatDateTime("yyyy-m-d",Now()) ;
      DataModule35->qry3->Close();
      DataModule35->qry3->SQL->Clear();
      DataModule35->qry3->SQL->Add("Select " + Form1->CdtCol + " from cdtinfo");
      DataModule35->qry3->SQL->Add(" where ComputerNo = :ComputerNo and (TerminalType = 3 or TerminalType = 4)");
      DataModule35->qry3->SQL->Add(" and Address in (select Author from CardAuthor where CardNo in(Select CardNo from Card where EndTime <= " +cEndTime+"))");

    这样比较好像不行啊。

    Select CardNo from Card where EndTime <= " +cEndTime+"这样比较大小好像是可以的,但是不能正确的比较日期的大小,不知道如何统一他们的单位,EndTime在数据库中是日期/时间格式的,记录如  3012-3-12   没有时间的,只有日期,望高人指点。
  2. A
    从数据库取出来AsDateTime就和BCB一致了。