将扩展转换为时间

时间:2015-09-09 12:13:17

标签: delphi

我需要将扩展​​值转换为时间格式。例如:

3.50 represents  00:03:50
62.02 represents 01:02:02
73.70 represents 01:14:10

我已经尝试了以下功能来转换小时和分钟部分,但我不知道如何转换秒的部分。

function ConvertToTime(AValue: Extended): TDateTime;
begin
    Result:=  EncodeTime(trunc(ArticleRec.Quantity) div 60,trunc(ArticleRec.Quantity) mod 60,0,0);
end;

感谢你期待你的帮助。

1 个答案:

答案 0 :(得分:2)

小数部分是这样获得的:

var
  SecondsFrac: Double;
....
SecondsFrac := Frac(Value);

然后你可以将0到1范围内的浮点小数值转换为0到100范围内的整数,如下所示:

var
  Seconds: Integer;
....
Seconds := Round(SecondsFrac*100);

这是一种非常奇怪的存储方式。您必须处理以下事实:Seconds >= 60时需要增加分钟数,并将Seconds减少60

我想我会把时间转换为秒,然后从那里开始:

function ConvertWeirdTimeFormatToSeconds(const Value: Double): Integer;
var
  SecondsFrac: Double;
begin
  SecondsFrac := Frac(Value);
  Result := Round(SecondsFrac*100) + Trunc(Value)*60;
end;

然后您可以将秒数解码为不同的部分,如下所示:

procedure DecodeSeconds(Value: Integer; out Hours, Minutes, Seconds: Integer);
begin
  Seconds := Value mod 60;
  Value := Value div 60;
  Minutes := Value mod 60;
  Value := Value div 60;
  Hours := Value;
end;

这让我觉得将时间存储在午夜的整数秒内可能会更好。在我看来,使用标准格式更有意义。

我认为没有理由在这里使用Extended,或者确实在任何地方使用public class SSOInit extends HandlerInterceptorAdapter { private static final Logger logger = Logger.getLogger(SSOInit.class.getName()); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { logger.info("### SSO : doInit, read page"); logger.info("### SSO : request url = " + request.getRequestURL()); logger.info("### SSO : request method = " + request.getMethod()); CredentialVO credential = SSOService.getUserCredential(); if (credential != null) { logger.info("### SSO : credential found, do check point"); String status = SSOService.checkSSOSessionKey(); if (status == null || status.equals("T")) { logger.info("### SSO : Check point didn't passed, redirect"); Authentication auth = SecurityContextHolder.getContext().getAuthentication(); if (auth != null) { new SecurityContextLogoutHandler().logout(request, response, auth); } SecurityContextHolder.getContext().setAuthentication(null); } else { logger.info("### SSO : Check point passed"); if (request.getServletPath().equals(SSOConstant.getREDIRECT_URL())) { logger.info("### SSO : Check point passed, user trying access login form but already authenticated, redirect"); response.sendRedirect(request.getContextPath() + SSOConstant.getMAIN_URL()); return false; } } } return super.preHandle(request, response, handler); } } 。这是一种非标准类型,由于其奇怪的尺寸和随之而来的对齐问题往往表现不佳。并且它仅在x86上受支持。