前往Shuct.Net首页

Shudepb PB反编译专家长时间以来,为业内同类软件事实上的唯一选择.细节,彰显专业.态度,决定品质.

关于PowerBuilder的搜索

PowerBuilder日期转换函数应用经验谈 - SilverLong专栏 - 博客频道 - CSDN.NET SilverLong专栏 程序员的命运 目录视图 摘要视图 订阅 新年新气象------CSDN2014新版导航就要跟大家见面了 2014年1月微软MVP当选名单揭晓! “我的2013”年度征文活动火爆进行中! 专访何海涛:“不正经”程序员的进阶之路 PowerBuilder日期转换函数应用经验谈 分类: PowerBuild 2006-09-28 14:36 2179人阅读 评论(0) 收藏 举报 PowerBuilderstringdate语言applicationbasic PowerBuilder日期转换函数应用经验谈 (深圳:独孤求败 2003-05-16)   某些程序语言,如Visual Basic语言、PowerBuilder的Script语言、Oracle的PL/SQL语言,都支持date或datetime数据类型,通常把日期(年、月、日)或日期和时间(时、分、秒)以某种内部方式存贮,比如存贮成相对于某一基准时刻(如1899年12月31日午夜)经过的秒数(或毫秒数),并提供时间类型和字符串类型之间的转换函数,用以与外界交换时间数据。   字符串类型应该用于输入、传递、输出,而不是长久地存贮时间数据。这样做的好处是时间的表示和存贮是分离的,不管如何表示,其内部存贮格式总是唯一的。如在应用程序的一屏把1997年12月31日显示为“97年12月31日[曹芳1][曹芳2]”,在另一屏显示为“12月31日”,而程序内部的存贮形式是相同的。程序对于时间变量的操作,包括计算(如由一个日期和间隔得到另一个日期)、比较、排序是基于其内部存贮形式而不是外部表示形式进行的。因此,2000年1月1日总是大于1999年12月31日,即使它们被显示为“00-01-01[曹芳3][曹芳4]”和“99-12-31[曹芳5][曹芳6]”,程序员把应用程序的千年兼容性交给了程序语言环境,而不是代码本身。相反地,如果程序员基于字符串进行时间的计算、比较、排序,他不仅将会为2位数字年份的千年兼容性烦恼,而且其时间操作的逻辑将会由于不同的语言环境中年月日的排列顺序不同而变得复杂。如英国人习惯使用 “dd/mm/yy[曹芳7][曹芳8]”,美国人习惯使用 “m/d/yy[曹芳9][曹芳10]”,因此字符串“4/3/97[曹芳11][曹芳12]”表示的日期,按英国习惯为 “3/4/97[曹芳13][曹芳14]”表示日的数字在前,而按美国习惯表示日的数字则在中间。   总之,只要程序语言支持日期数据类型,就应该只使用该数据类型进行日期操作;字符串数据类型只能用于日期的输入、传递、输出,在转换成日期类型之后才能进行日期操作。字符串表示的日期,其年、月、日格式是由人为规定的或由环境决定的,对同一字符串按照不同的格式解释会得到不同的结果,因此在字符串与日期的转换函数中必须显式地或隐含地指明所使用的日期格式。显式的作法是把日期格式作为转换函数的一个参数,隐含的作法则是不提供格式参数,而使用某一个系统变量指定的日期格式。在使用显式或隐含格式进行转换这一点上, Basic、PL/SQL、PowerBuilder正好代表了3种典型的情况,其具体实现如下表所示。 日期→字符串 字符串→日期 Basic Scr(date) Cdate(string) PL/SQL TO-CHAR(date{,format) TO-DATE(string{,format) PowerBuilder String(date[,format]) Date(string)   可以看出,Basic只支持隐含格式转换,在Windows平台上,该隐含格式由“控制面板→区域设置→日期→短日期样式”设置。PL/SQL最为灵活,既支持隐含格式转换,也支持显式格式转换。两种语言中,两个互逆转换函数都是对称的。PowerBuilder则不同,其从日期到字符串转换函数String()支持显式格式和隐含格式,从字符串到日期转换函数Date()则只支持隐含格式。笔者以为,这种不对称性值得注意,它可能导致时间转换出错的隐患。让我们先看以下的PowerScript语句:   Date l—date   String l—string   l—date = 1999-12-31   l—string = string(l—date, "dd/mm/yy")   l—date = date(l—string)   其运行结果是:如果“控制面板→短日期样式”设置成“dd/mm/yy[曹芳15][曹芳16]”, l—date最后值为1999-12-31;如果“短日期样式”设置成“mm/dd/yy [曹芳17][曹芳18]”或“mm-dd-yy [曹芳19][曹芳20]”,l—date最后值为1900-01-01(非法日期)。但如果在string()中省略第2个参数,无论“短日期样式”如何设置,只要不在执行最后两行语句之间改变该设置(这是可能的,只改变该设置而不改变“区域设置”,可以立即生效而不必重新启动),结果总是正确。   这一问题的实质是,如果将日期类型按照某一格式转换成字符串类型,在把这一字符串类型解释成日期时,必须采用同一格式。但我们不能为date()指定格式参数,它只能使用“短日期样式”指定的格式,为了与此对应,在使用string()时,要么必须显式地指定与“短日期样式”相同的格式,要么省略格式参数从而隐含地采用“短日期样式”格式(实际上string()和date()不必使用完全相同的格式,只需两种格式的年月日次序相同即可)。这样看来,string()的第2个参数似乎有些多余。   当然,如果string()的转换结果l—string只用于显示或输出,不会再被date()转换回日期类型,那么无论使用什么格式参数也就无所谓了。但在实际应用中,上面的最后两行可能处于不同模块中,中间经过多个全局变量和函数参数的传递,并非如此一目了然。   针对PowerBuilder的这一问题,我们提出如下3种解决办法:   (1) 同一应用程序中所有string()使用的显式格式都必须相同,并在《用户手册》或《安装手册》中明确告知用户该程序的运行环境是“控制面板→短日期样式”必须设置成这一格式。   (2) 同一应用程序中所有string()使用的显式格式都必须相同,并在Application 的Open事件中把“控制面板 →短日期样式”强行修改为这一格式:   RegistryGet(″HKEY—CURRENT—USER/Control Panel/International/″,  ″sShortDate″, gs—date—format)   RegistryGet(″HKEY—CURRENT—USER/Control Pane l/International/″,   ″sShortDate″,″dd/mm/yy″)   其中″dd/mm/yy″假定为string()将使用的显式格式,gs—date—format是一个全局变量,用于在Application的Close事件中恢复“短日期样式”:   RegistrySet (″HKEY—CURRENT—USER/Control Panel/International/″,  ″sShortDate″, gs—date—format)   应该指出,为严格防止用户在应用程序运行期间改变“短日期样式”,必须在每次使用date()之前和之后都执行上述操作,不过这无疑会大大影响程序的执行性能。   (3) 把程序中表示日期的所有字符串类型分为两类:一类用于临时存贮和传递,以后将被转换回日期类型;另一类用于显示和输出,不会再被转换回日期类型。对于前者,省略string()中的第2个参数,迫使其使用与date()相同的格式;对于后者,string()中的第2个参数可以省略,也可以使用任何有效值。   当然,最完美的解决办法是在以后的PowerBuilder版本中date()函数被修改为date (string{,format})   这就使我们既能使用隐含格式进行转换,也能使用显式格式进行转换,正如PL/SQL的TO—DATE()一样。 更多 上一篇:PowerBuilder日期转换函数应用经验谈 下一篇:依据条件改变数据颜色 查看评论 * 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场 核心技术类目 全部主题 Java VPN Android iOS ERP IE10 Eclipse CRM JavaScript Ubuntu NFC WAP jQuery 数据库 BI HTML5 Spring Apache Hadoop .NET API HTML SDK IIS Fedora XML LBS Unity Splashtop UML components Windows Mobile Rails QEMU KDE Cassandra CloudStack FTC coremail OPhone CouchBase 云计算 iOS6 Rackspace Web App SpringSide Maemo Compuware 大数据 aptech Perl Tornado Ruby Hibernate ThinkPHP Spark HBase Pure Solr Angular Cloud Foundry Redis Scala Django Bootstrap 个人资料 Jason009 访问:165516次 积分:3063分 排名:第2643名 原创:134篇 转载:47篇 译文:0篇 评论:19条 文章搜索 文章分类 C/C++(19) CSharp(15) DELPHI(39) DotNet(0) JAVA(17) PowerBuild(27) 其它(45) 数据库(3) 日记(0) 文章存档 2014年01月(23)2010年08月(1)2009年06月(1)2008年04月(4)2008年03月(13)2008年02月(4)2007年09月(2)2006年11月(2)2006年10月(13)2006年09月(100)2006年06月(6)2006年05月(11)2005年12月(1) 阅读排行 PB函数大全(11864) C#中动态创建控件及事件处理程序(7566) 收集PB使用中的一些资料及技巧(6842) 商 务 英 语 常 用 缩 略 语 表(3580) 端口说明大全(3097) Eclipse教程(3078) PB 的 error.number 列表(2914) 如何判断文本文件的编码格式?(2405) PowerBuilder日期转换函数应用经验谈(2179) VC开发数据库基础之ADO篇(2178) 评论排行 收集PB使用中的一些资料及技巧(5) PB函数大全(3) Eclipse教程(3) 关于数据库字典的汉字注释维护(2) Java模拟.NET的连接池(2) OOP在三层系统中的应用(2) Office函数库(EXCEL)(1) 一个大公司JAVA考题的问题 (1) 项目管理概述(0) 如何填写项目报告(0) 推荐文章 最新评论 收集PB使用中的一些资料及技巧 binbin_1868: 来学习学习 Office函数库(EXCEL) hxb815: 感觉好麻烦哦 关于数据库字典的汉字注释维护 nnw_601: SET "PBC_TNAM" = :ls_table, "PBC_OWNR" = :is_ownr,... 关于数据库字典的汉字注释维护 nnw_601: 请问这个表SYSTEM.pbcattbl在哪里?oracle数据库中没找到啊! PB函数大全 ya_la: 学习了 PB函数大全 wzh502887976: good 收集PB使用中的一些资料及技巧 hndyf: Eclipse教程 wocom: 呵呵 非常感谢 可就是怎么没图片啊????? PB函数大全 wocom: 不错 好 收集PB使用中的一些资料及技巧 stephfina: