[jcifs] timezone problems
Julian Reschke
julian.reschke at gmx.de
Tue Mar 9 18:54:09 GMT 2004
Christopher R. Hertel wrote:
>>>If the time being reported via SMB is based on the *server's* local time,
>>>then the client must convert the time to the *client's* local time. To do
>>>this, it uses the server time reported in the SMB Negotiate Protocol
>>>Response. That's that weird bozosecond timestamp. The client must
>>>compare the server's time against its own local time to calculate the
>>>difference.
>>
>>Well, no. First of all, whatever the format on the wire is, JCifs needs
>>to convert it to *UTC* (that is GMT w/o DST) first, because this is the
>>format used by Java for timestamps (at least as java.io.File and SmbFile
>>are concerned):
>
>
> That's what I was saying.
>
> If the [file] time[stamp] being reported via SMB is based on the
> *server's* local time [that is, if the SMB message contains the SMB_TIME
> and SMB_DATE as listed in FAT], then the client must convert the time [for
> display purposes] to the *client's* local time.
No, it doesn't have to. The SMB library itself is first of all required
to report the correct UTC-based timestamp (this is what the Java API is
about).
Of course a client running on top of that can use the client's local
timezone settings to display the normalized UTC timestamp, but this is a
transformation that should occur *on top* of SmbFile.getLastModified().
> To do this [that is, provide the correct local time for display], it uses
> the server time reported in the SMB Negotiate Protocol Response [which is
> given as UTC based on Jan. 1 1601].
>
> That whole thing was about how the client would give the correct local
> time from the client's perspective.
>
>>Conversion to local timezones and DST considerations need to be done in
>>the code *on top of* JCifs (for instance, by construcing Java Date
>>objects and by formatting them using Java's locale support).
>
>
> Yes, but you can't do that unless you know the offset to the server's
> time. That's where the NegProt timestamp comes in.
>
> Since the file timestamps are stored in server local time (in FAT) I
> assume that they are also reported that way via SMB. To convert those
> into UTC you also need to know the difference between server time and UTC.
I'm no SMB expert, and I have trouble following this description. If the
SMB protocol provides an UTC-based timestamp, and JCifs is supposed to
return UTC-based timestamps, why do we need a translation at this level?
>>>Note that calculating the time for display on the client does involve Java
>>>doing a lot of time manipulations locally. There's lots of opportunities
>>>for subtle bugs at all levels.
>>
>>Yes. But this shouldn't occur at that level. SmbFile is a filie I/O API,
>>not a user interface, and it's supposed to use UTC, not local time (at
>>least I would assume so because this is was java.io.File does).
>
>
> So at which point do you apply the DST conversion in your code?
> Just curious...
I don't at all. I'm just trying to use SmbFile with the same semantics
as java.io.File. For instance, on top of my code there's a CMS system
running with WebDAV interfaces. These interfaces are only interested in
UTC based timestamps, mapping that to some suited for a particular TZ is
a user interface issue (for instace, done by the Microsoft Webfolder
client).
>>>Does jCIFS return differnt values when running on, say, Linux vs. W2K and
>>>accessing the same file?
>>
>>I'll try tomorrow.
>
>
> Looking forward to the results.
See separate mail...
Julian
--
<green/>bytes GmbH -- http://www.greenbytes.de -- tel:+492512807760
More information about the jcifs
mailing list