zs.go 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882
  1. /*
  2. * Copyright (c) 2000-2018, 达梦数据库有限公司.
  3. * All rights reserved.
  4. */
  5. package dm
  6. import (
  7. "fmt"
  8. "math"
  9. "strconv"
  10. "strings"
  11. "time"
  12. "unicode"
  13. "unicode/utf8"
  14. "gitee.com/chunanyong/dm/util"
  15. )
  16. type oracleDateFormat struct {
  17. PM bool
  18. TZNegative bool
  19. pattern string
  20. language int
  21. scale int32
  22. FormatElementList []interface{}
  23. YearElement yearElement
  24. MonthElement monthElement
  25. MonElement monElement
  26. MMElement mmElement
  27. DDElement ddElement
  28. HH24Element hh24Element
  29. HH12Element hh12Element
  30. MIElement miElement
  31. SSElement ssElement
  32. FElement fElement
  33. TZHElement tzhElement
  34. TZMElement tzmElement
  35. AMElement amElement
  36. }
  37. type element interface {
  38. /**
  39. * 从字符串中解析出对应的值,
  40. * @param str 完整的字符串
  41. * @param offset 当前偏移
  42. * @return 解析后的offset
  43. */
  44. parse(str string, offset int, dt []int) (int, error)
  45. /**
  46. * 将时间值value格式化成字符串
  47. */
  48. format(dt []int) string
  49. }
  50. type yearElement struct {
  51. OracleDateFormat *oracleDateFormat
  52. len int
  53. }
  54. func (YearElement yearElement) parse(str string, offset int, dt []int) (int, error) {
  55. strLen := 0
  56. for i := offset; i < offset+YearElement.len && i < len(str); i++ {
  57. if !unicode.IsLetter(rune(str[i])) && !unicode.IsDigit(rune(str[i])) {
  58. break
  59. }
  60. strLen++
  61. }
  62. str = str[offset : offset+strLen]
  63. if YearElement.len < 4 {
  64. today := strconv.FormatInt(int64(dt[OFFSET_YEAR]), 10)
  65. i, err := strconv.ParseInt(today[:4-YearElement.len]+str, 10, 32)
  66. if err != nil {
  67. return 0, err
  68. }
  69. dt[OFFSET_YEAR] = int(i)
  70. } else {
  71. i, err := strconv.ParseInt(str, 10, 32)
  72. if err != nil {
  73. return 0, err
  74. }
  75. dt[OFFSET_YEAR] = int(i)
  76. }
  77. return offset + strLen, nil
  78. }
  79. func (YearElement yearElement) format(dt []int) string {
  80. return YearElement.OracleDateFormat.formatInt(dt[OFFSET_YEAR], YearElement.len)
  81. }
  82. type monthElement struct {
  83. OracleDateFormat *oracleDateFormat
  84. upperCase bool
  85. lowerCase bool
  86. }
  87. var monthNameList = []string{"", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}
  88. func (MonthElement monthElement) parse(str string, offset int, dt []int) (int, error) {
  89. if MonthElement.OracleDateFormat.language == LANGUAGE_CN {
  90. index := strings.IndexRune(str[offset:], '月')
  91. if index == -1 {
  92. return -1, ECGO_INVALID_DATETIME_FORMAT.throw()
  93. }
  94. index += offset
  95. mon, err := strconv.ParseInt(str[offset:index], 10, 32)
  96. if err != nil {
  97. return -1, ECGO_INVALID_DATETIME_FORMAT.throw()
  98. }
  99. if mon > 12 || mon < 1 {
  100. return -1, ECGO_INVALID_DATETIME_VALUE.throw()
  101. }
  102. dt[OFFSET_MONTH] = int(mon)
  103. return index + utf8.RuneLen('月'), nil
  104. } else {
  105. str = str[offset:]
  106. mon := 0
  107. for i := 1; i < len(monthNameList); i++ {
  108. if util.StringUtil.StartWithIgnoreCase(str, monthNameList[i]) {
  109. mon = i
  110. break
  111. }
  112. }
  113. if mon == 0 {
  114. return -1, ECGO_INVALID_DATETIME_FORMAT.throw()
  115. }
  116. dt[OFFSET_MONTH] = mon
  117. return offset + len(monthNameList[mon]), nil
  118. }
  119. }
  120. func (MonthElement monthElement) format(dt []int) string {
  121. value := dt[OFFSET_MONTH]
  122. if MonthElement.OracleDateFormat.language == LANGUAGE_CN {
  123. return strconv.FormatInt(int64(value), 10) + "月"
  124. }
  125. if MonthElement.upperCase {
  126. return strings.ToUpper(monthNameList[value])
  127. } else if MonthElement.lowerCase {
  128. return strings.ToLower(monthNameList[value])
  129. } else {
  130. return monthNameList[value]
  131. }
  132. }
  133. type monElement struct {
  134. OracleDateFormat *oracleDateFormat
  135. upperCase bool
  136. lowerCase bool
  137. }
  138. var monNameList []string = []string{"", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}
  139. func (MonElement monElement) parse(str string, offset int, dt []int) (int, error) {
  140. if MonElement.OracleDateFormat.language == LANGUAGE_CN {
  141. index := strings.IndexRune(str[offset:], '月') + offset
  142. if index == -1+offset {
  143. return -1, ECGO_INVALID_DATETIME_FORMAT.throw()
  144. }
  145. mon, err := strconv.ParseInt(str[offset:index], 10, 32)
  146. if err != nil {
  147. return -1, err
  148. }
  149. if mon > 12 || mon < 1 {
  150. return -1, ECGO_INVALID_DATETIME_VALUE.throw()
  151. }
  152. dt[OFFSET_MONTH] = int(mon)
  153. return index + utf8.RuneLen('月'), nil
  154. } else {
  155. str = str[offset : offset+3]
  156. mon := 0
  157. for i := 1; i < len(monNameList); i++ {
  158. if util.StringUtil.EqualsIgnoreCase(str, monNameList[i]) {
  159. mon = i
  160. break
  161. }
  162. }
  163. if mon == 0 {
  164. return -1, ECGO_INVALID_DATETIME_FORMAT.throw()
  165. }
  166. dt[OFFSET_MONTH] = mon
  167. return offset + 3, nil
  168. }
  169. }
  170. func (MonElement monElement) format(dt []int) string {
  171. value := dt[OFFSET_MONTH]
  172. language := int(0)
  173. if language == LANGUAGE_CN {
  174. return strconv.FormatInt(int64(value), 10) + "月"
  175. }
  176. if MonElement.upperCase {
  177. return strings.ToUpper(monNameList[value])
  178. } else if MonElement.lowerCase {
  179. return strings.ToLower(monNameList[value])
  180. } else {
  181. return monNameList[value]
  182. }
  183. }
  184. type mmElement struct {
  185. OracleDateFormat *oracleDateFormat
  186. }
  187. func (MMElement mmElement) parse(str string, offset int, dt []int) (int, error) {
  188. strLen := 0
  189. for i := offset; i < offset+2 && i < len(str); i++ {
  190. if !unicode.IsLetter(rune(str[i])) && !unicode.IsDigit(rune(str[i])) {
  191. break
  192. }
  193. strLen++
  194. }
  195. str = str[offset : offset+strLen]
  196. month, err := strconv.ParseInt(str, 10, 32)
  197. if err != nil {
  198. return -1, ECGO_INVALID_DATETIME_FORMAT.throw()
  199. }
  200. if month > 12 || month < 1 {
  201. return -1, ECGO_INVALID_DATETIME_VALUE.throw()
  202. }
  203. dt[OFFSET_MONTH] = int(month)
  204. return offset + strLen, nil
  205. }
  206. func (MMElement mmElement) format(dt []int) string {
  207. return MMElement.OracleDateFormat.formatInt(dt[OFFSET_MONTH], 2)
  208. }
  209. type ddElement struct {
  210. OracleDateFormat *oracleDateFormat
  211. }
  212. func (DDElement ddElement) parse(str string, offset int, dt []int) (int, error) {
  213. strLen := 0
  214. for i := offset; i < offset+2 && i < len(str); i++ {
  215. if !unicode.IsLetter(rune(str[i])) && !unicode.IsDigit(rune(str[i])) {
  216. break
  217. }
  218. strLen++
  219. }
  220. str = str[offset : offset+strLen]
  221. day, err := strconv.ParseInt(str, 10, 32)
  222. if err != nil {
  223. return -1, err
  224. }
  225. if day > 31 || day < 1 {
  226. return -1, ECGO_INVALID_DATETIME_VALUE.throw()
  227. }
  228. dt[OFFSET_DAY] = int(day)
  229. return offset + strLen, nil
  230. }
  231. func (DDElement ddElement) format(dt []int) string {
  232. return DDElement.OracleDateFormat.formatInt(dt[OFFSET_DAY], 2)
  233. }
  234. type hh24Element struct {
  235. OracleDateFormat *oracleDateFormat
  236. }
  237. func (HH24Element hh24Element) parse(str string, offset int, dt []int) (int, error) {
  238. strLen := 0
  239. for i := offset; i < offset+2 && i < len(str); i++ {
  240. if !unicode.IsLetter(rune(str[i])) && !unicode.IsDigit(rune(str[i])) {
  241. break
  242. }
  243. strLen++
  244. }
  245. str = str[offset : offset+strLen]
  246. hour, err := strconv.ParseInt(str, 10, 32)
  247. if err != nil {
  248. return -1, err
  249. }
  250. if hour > 23 || hour < 0 {
  251. return -1, ECGO_INVALID_DATETIME_VALUE.throw()
  252. }
  253. dt[OFFSET_HOUR] = int(hour) // 0-23
  254. return offset + strLen, nil
  255. }
  256. func (HH24Element hh24Element) format(dt []int) string {
  257. return HH24Element.OracleDateFormat.formatInt(dt[OFFSET_HOUR], 2) // 0-23
  258. }
  259. type hh12Element struct {
  260. OracleDateFormat *oracleDateFormat
  261. }
  262. func (HH12Element hh12Element) parse(str string, offset int, dt []int) (int, error) {
  263. strLen := 0
  264. for i := offset; i < offset+2 && i < len(str); i++ {
  265. if !unicode.IsLetter(rune(str[i])) && !unicode.IsDigit(rune(str[i])) {
  266. break
  267. }
  268. strLen++
  269. }
  270. str = str[offset : offset+strLen]
  271. hour, err := strconv.ParseInt(str, 10, 32)
  272. if err != nil {
  273. return -1, err
  274. }
  275. if hour > 12 || hour < 1 {
  276. return -1, ECGO_INVALID_DATETIME_VALUE.throw()
  277. }
  278. dt[OFFSET_HOUR] = int(hour)
  279. return offset + strLen, nil
  280. }
  281. func (HH12Element hh12Element) format(dt []int) string {
  282. var ret string
  283. value := dt[OFFSET_HOUR]
  284. if value > 12 || value == 0 {
  285. ret = HH12Element.OracleDateFormat.formatInt(int(math.Abs(float64(value-12))), 2) // 1-12
  286. } else {
  287. ret = HH12Element.OracleDateFormat.formatInt(value, 2)
  288. }
  289. return ret
  290. }
  291. type miElement struct {
  292. OracleDateFormat *oracleDateFormat
  293. }
  294. func (MIElement miElement) parse(str string, offset int, dt []int) (int, error) {
  295. strLen := 0
  296. for i := offset; i < offset+2 && i < len(str); i++ {
  297. if !unicode.IsLetter(rune(str[i])) && !unicode.IsDigit(rune(str[i])) {
  298. break
  299. }
  300. strLen++
  301. }
  302. str = str[offset : offset+strLen]
  303. minute, err := strconv.ParseInt(str, 10, 32)
  304. if err != nil {
  305. return -1, err
  306. }
  307. if minute > 59 || minute < 0 {
  308. return -1, ECGO_INVALID_DATETIME_VALUE.throw()
  309. }
  310. dt[OFFSET_MINUTE] = int(minute) // 0-59
  311. return offset + strLen, nil
  312. }
  313. func (MIElement miElement) format(dt []int) string {
  314. return MIElement.OracleDateFormat.formatInt(dt[OFFSET_MINUTE], 2) // 0-59
  315. }
  316. type ssElement struct {
  317. OracleDateFormat *oracleDateFormat
  318. }
  319. func (SSElement ssElement) parse(str string, offset int, dt []int) (int, error) {
  320. strLen := 0
  321. for i := offset; i < offset+2 && i < len(str); i++ {
  322. if !unicode.IsLetter(rune(str[i])) && !unicode.IsDigit(rune(str[i])) {
  323. break
  324. }
  325. strLen++
  326. }
  327. str = str[offset : offset+strLen]
  328. second, err := strconv.ParseInt(str, 10, 32)
  329. if err != nil {
  330. return -1, err
  331. }
  332. if second > 59 || second < 0 {
  333. return -1, ECGO_INVALID_DATETIME_VALUE.throw()
  334. }
  335. dt[OFFSET_SECOND] = int(second) // 0-59
  336. return offset + strLen, nil
  337. }
  338. func (SSElement ssElement) format(dt []int) string {
  339. return SSElement.OracleDateFormat.formatInt(dt[OFFSET_SECOND], 2) // 0-59
  340. }
  341. type fElement struct {
  342. OracleDateFormat *oracleDateFormat
  343. len int
  344. }
  345. func (FElement fElement) parse(str string, offset int, dt []int) (int, error) {
  346. strLen := 0
  347. maxLen := 0
  348. if FElement.len > 0 {
  349. maxLen = FElement.len
  350. } else {
  351. maxLen = NANOSECOND_DIGITS
  352. }
  353. for i := offset; i < offset+maxLen && i < len(str); i++ {
  354. if !unicode.IsLetter(rune(str[i])) && !unicode.IsDigit(rune(str[i])) {
  355. break
  356. }
  357. strLen++
  358. }
  359. str = str[offset : offset+strLen]
  360. ms, err := strconv.ParseInt(str, 10, 32)
  361. if err != nil {
  362. return -1, err
  363. }
  364. if strLen < NANOSECOND_DIGITS {
  365. ms *= int64(math.Pow10(NANOSECOND_DIGITS - strLen))
  366. } else {
  367. ms /= int64(math.Pow10(strLen - NANOSECOND_DIGITS))
  368. }
  369. dt[OFFSET_NANOSECOND] = int(ms)
  370. return offset + strLen, nil
  371. }
  372. func (FElement fElement) format(dt []int) string {
  373. msgLen := 0
  374. if FElement.len > 0 {
  375. msgLen = FElement.len
  376. } else {
  377. msgLen = int(FElement.OracleDateFormat.scale)
  378. }
  379. return FElement.OracleDateFormat.formatMilliSecond(dt[OFFSET_NANOSECOND], msgLen)
  380. }
  381. type tzhElement struct {
  382. OracleDateFormat *oracleDateFormat
  383. }
  384. func (TZHElement tzhElement) parse(str string, offset int, dt []int) (int, error) {
  385. if str[offset] == '+' {
  386. offset += 1
  387. } else if str[offset] == '-' {
  388. offset += 1
  389. TZHElement.OracleDateFormat.TZNegative = true
  390. }
  391. strLen := 0
  392. for i := offset; i < offset+2 && i < len(str); i++ {
  393. if !unicode.IsLetter(rune(str[i])) && !unicode.IsDigit(rune(str[i])) {
  394. break
  395. }
  396. strLen++
  397. }
  398. str = str[offset : offset+strLen]
  399. tzh, err := strconv.ParseInt(str, 10, 32)
  400. if err != nil {
  401. return -1, err
  402. }
  403. if tzh > 23 || tzh < 0 {
  404. return -1, ECGO_INVALID_DATETIME_VALUE.throw()
  405. }
  406. tzh *= 60
  407. if dt[OFFSET_TIMEZONE] == int(INVALID_VALUE) {
  408. dt[OFFSET_TIMEZONE] = int(tzh)
  409. } else {
  410. dt[OFFSET_TIMEZONE] += int(tzh)
  411. }
  412. return offset + strLen, nil
  413. }
  414. func (TZHElement tzhElement) format(dt []int) string {
  415. var value int
  416. if dt[OFFSET_TIMEZONE] != int(INVALID_VALUE) {
  417. value = int(math.Abs(float64(dt[OFFSET_TIMEZONE]))) / 60
  418. } else {
  419. value = 0
  420. }
  421. return TZHElement.OracleDateFormat.formatInt(value, 2)
  422. }
  423. type tzmElement struct {
  424. OracleDateFormat *oracleDateFormat
  425. }
  426. func (TZMElement tzmElement) parse(str string, offset int, dt []int) (int, error) {
  427. if str[offset] == '+' {
  428. offset += 1
  429. } else if str[offset] == '-' {
  430. offset += 1
  431. TZMElement.OracleDateFormat.TZNegative = true
  432. }
  433. strLen := 0
  434. for i := offset; i < offset+2 && i < len(str); i++ {
  435. if !unicode.IsLetter(rune(str[i])) && !unicode.IsDigit(rune(str[i])) {
  436. break
  437. }
  438. strLen++
  439. }
  440. str = str[offset : offset+strLen]
  441. tzm, err := strconv.ParseInt(str, 10, 32)
  442. if err != nil {
  443. return -1, err
  444. }
  445. if tzm > 59 || tzm < 0 {
  446. return -1, ECGO_INVALID_DATETIME_VALUE.throw()
  447. }
  448. if dt[OFFSET_TIMEZONE] == INVALID_VALUE {
  449. dt[OFFSET_TIMEZONE] = int(tzm)
  450. } else {
  451. dt[OFFSET_TIMEZONE] += int(tzm)
  452. }
  453. return offset + strLen, nil
  454. }
  455. func (TZMElement tzmElement) format(dt []int) string {
  456. var value int
  457. if dt[OFFSET_TIMEZONE] != int(INVALID_VALUE) {
  458. value = int(math.Abs(float64(dt[OFFSET_TIMEZONE]))) % 60
  459. } else {
  460. value = 0
  461. }
  462. return TZMElement.OracleDateFormat.formatInt(value, 2)
  463. }
  464. type amElement struct {
  465. OracleDateFormat *oracleDateFormat
  466. }
  467. func (AMElement amElement) parse(str string, offset int, dt []int) (int, error) {
  468. runeStr := ([]rune(str))[offset : offset+2]
  469. if AMElement.OracleDateFormat.language == LANGUAGE_CN {
  470. if util.StringUtil.EqualsIgnoreCase("下午", string(runeStr)) {
  471. AMElement.OracleDateFormat.PM = true
  472. return offset + utf8.RuneLen('下') + utf8.RuneLen('午'), nil
  473. } else {
  474. AMElement.OracleDateFormat.PM = false
  475. return offset + utf8.RuneLen('上') + utf8.RuneLen('午'), nil
  476. }
  477. } else if util.StringUtil.EqualsIgnoreCase("PM", string(runeStr)) {
  478. AMElement.OracleDateFormat.PM = true
  479. } else {
  480. AMElement.OracleDateFormat.PM = false
  481. }
  482. return offset + 2, nil
  483. }
  484. func (AMElement amElement) format(dt []int) string {
  485. hour := dt[OFFSET_HOUR]
  486. language := int(0)
  487. if language == LANGUAGE_CN {
  488. if hour > 12 {
  489. return "下午"
  490. } else {
  491. return "上午"
  492. }
  493. }
  494. if hour > 12 {
  495. return "PM"
  496. } else {
  497. return "AM"
  498. }
  499. }
  500. /**
  501. * 将int值格式化成指定长度,长度不足前面补0,长度超过的取末尾指定长度
  502. */
  503. func (OracleDateFormat *oracleDateFormat) formatInt(value int, len int) string {
  504. pow := int(math.Pow10(len))
  505. if value >= pow {
  506. value %= pow
  507. }
  508. value += pow
  509. return strconv.FormatInt(int64(value), 10)[1:]
  510. }
  511. /**
  512. * 格式化毫秒值
  513. * @param ms
  514. * @param len <= 6
  515. */
  516. func (OracleDateFormat *oracleDateFormat) formatMilliSecond(ms int, len int) string {
  517. var ret string
  518. if ms < 10 {
  519. ret = "00000" + strconv.FormatInt(int64(ms), 10)
  520. } else if ms < 100 {
  521. ret = "0000" + strconv.FormatInt(int64(ms), 10)
  522. } else if ms < 1000 {
  523. ret = "000" + strconv.FormatInt(int64(ms), 10)
  524. } else if ms < 10000 {
  525. ret = "00" + strconv.FormatInt(int64(ms), 10)
  526. } else if ms < 100000 {
  527. ret = "0" + strconv.FormatInt(int64(ms), 10)
  528. } else {
  529. ret = strconv.FormatInt(int64(ms), 10)
  530. }
  531. if len < 6 {
  532. ret = ret[:len]
  533. }
  534. return ret
  535. }
  536. func getFormat() *oracleDateFormat {
  537. format := new(oracleDateFormat)
  538. format.PM = false
  539. format.TZNegative = false
  540. format.YearElement = yearElement{format, 4}
  541. format.MonthElement = monthElement{format, false, false}
  542. format.MonElement = monElement{format, false, false}
  543. format.MMElement = mmElement{format}
  544. format.DDElement = ddElement{format}
  545. format.HH24Element = hh24Element{format}
  546. format.HH12Element = hh12Element{format}
  547. format.MIElement = miElement{format}
  548. format.SSElement = ssElement{format}
  549. format.FElement = fElement{format, -1}
  550. format.TZHElement = tzhElement{format}
  551. format.TZMElement = tzmElement{format}
  552. format.AMElement = amElement{format}
  553. return format
  554. }
  555. func (OracleDateFormat *oracleDateFormat) parse(str string) (ret []int, err error) {
  556. defer func() {
  557. if p := recover(); p != nil {
  558. err = ECGO_INVALID_DATETIME_FORMAT.throw()
  559. }
  560. }()
  561. OracleDateFormat.TZNegative = false
  562. OracleDateFormat.PM = false
  563. dt := make([]int, DT_LEN)
  564. // oracle默认年月日为 当前时间
  565. today := time.Now()
  566. dt[OFFSET_YEAR] = today.Year()
  567. dt[OFFSET_MONTH] = int(today.Month())
  568. dt[OFFSET_DAY] = today.Day()
  569. dt[OFFSET_TIMEZONE] = INVALID_VALUE
  570. offset := 0
  571. str = strings.TrimSpace(str)
  572. for _, obj := range OracleDateFormat.FormatElementList {
  573. // 跳过空格
  574. for str[offset] == ' ' && fmt.Sprintf("%+v", obj) != " " {
  575. offset++
  576. }
  577. if e, ok := obj.(element); ok {
  578. offset, err = e.parse(str, offset, dt)
  579. if err != nil {
  580. return nil, err
  581. }
  582. } else {
  583. offset += len(obj.(string))
  584. }
  585. }
  586. if offset < len(str) {
  587. //[6103]:文字与格式字符串不匹配.
  588. return nil, ECGO_INVALID_DATETIME_VALUE.throw()
  589. }
  590. // 12小时制时间转换
  591. if OracleDateFormat.PM {
  592. dt[OFFSET_HOUR] = (dt[OFFSET_HOUR] + 12) % 24
  593. }
  594. // 时区符号保留
  595. if OracleDateFormat.TZNegative {
  596. dt[OFFSET_TIMEZONE] = -dt[OFFSET_TIMEZONE]
  597. }
  598. // check day
  599. if dt[OFFSET_DAY] > getDaysOfMonth(dt[OFFSET_YEAR], dt[OFFSET_MONTH]) || dt[OFFSET_DAY] < 1 {
  600. return nil, ECGO_INVALID_DATETIME_VALUE.throw()
  601. }
  602. // check timezone 兼容oracle
  603. if dt[OFFSET_TIMEZONE] != INVALID_VALUE && (dt[OFFSET_TIMEZONE] > 14*60 || dt[OFFSET_TIMEZONE] <= -13*60) {
  604. return nil, ECGO_INVALID_DATETIME_VALUE.throw()
  605. }
  606. return dt, nil
  607. }
  608. func parse(str string, pattern string, language int) ([]int, error) {
  609. f := getFormat()
  610. f.setPattern(pattern)
  611. f.language = language
  612. return f.parse(str)
  613. }
  614. func (OracleDateFormat *oracleDateFormat) setPattern(pattern string) {
  615. if pattern != OracleDateFormat.pattern {
  616. OracleDateFormat.pattern = pattern
  617. OracleDateFormat.FormatElementList = OracleDateFormat.FormatElementList[:0]
  618. OracleDateFormat.analysePattern(pattern)
  619. }
  620. }
  621. func format(dt []int, pattern string, scale int32, language int) string {
  622. f := getFormat()
  623. f.setPattern(pattern)
  624. f.language = language
  625. f.scale = scale
  626. ret := f.format(dt)
  627. return ret
  628. }
  629. func (OracleDateFormat *oracleDateFormat) format(dt []int) string {
  630. sf := strings.Builder{}
  631. tzStart := false
  632. for _, obj := range OracleDateFormat.FormatElementList {
  633. _, ok1 := obj.(tzhElement)
  634. _, ok2 := obj.(tzmElement)
  635. if !tzStart && (ok1 || ok2) {
  636. tzStart = true
  637. if dt[OFFSET_TIMEZONE] < 0 {
  638. sf.WriteString("-")
  639. } else {
  640. sf.WriteString("+")
  641. }
  642. }
  643. if e, ok := obj.(element); ok {
  644. sf.WriteString(e.format(dt))
  645. } else {
  646. sf.WriteString(obj.(string))
  647. }
  648. }
  649. return sf.String()
  650. }
  651. /**
  652. * 解析格式串
  653. */
  654. func (OracleDateFormat *oracleDateFormat) analysePattern(pattern string) ([]interface{}, error) {
  655. // 按分隔符split
  656. pattern = strings.TrimSpace(pattern)
  657. l := len(pattern)
  658. var splitPatterns []string
  659. starti := 0
  660. var curChar rune
  661. for i := 0; i < l; i++ {
  662. curChar = rune(pattern[i])
  663. if !unicode.IsDigit(curChar) && !unicode.IsLetter(curChar) {
  664. if i > starti {
  665. splitPatterns = append(splitPatterns, pattern[starti:i])
  666. }
  667. splitPatterns = append(splitPatterns, string(curChar))
  668. starti = i + 1
  669. } else if i == l-1 {
  670. splitPatterns = append(splitPatterns, pattern[starti:i+1])
  671. }
  672. }
  673. // 每个串按照从完整串,然后依次去掉一个末尾字符 来进行尝试规约
  674. for _, subPattern := range splitPatterns {
  675. if len(subPattern) != 1 || unicode.IsDigit(rune(subPattern[0])) || unicode.IsLetter(rune(subPattern[0])) {
  676. fmtWord := subPattern
  677. for subPattern != "" {
  678. i := len(subPattern)
  679. for ; i > 0; i-- {
  680. fmtWord = subPattern[0:i]
  681. element, err := OracleDateFormat.getFormatElement(fmtWord)
  682. if err != nil {
  683. return nil, err
  684. }
  685. if element != nil {
  686. // 忽略时区前面的+-号
  687. if element == OracleDateFormat.TZHElement || element == OracleDateFormat.TZMElement {
  688. var lastFormatElement string = OracleDateFormat.FormatElementList[len(OracleDateFormat.FormatElementList)-1].(string)
  689. if util.StringUtil.Equals("+", lastFormatElement) || util.StringUtil.Equals("-", lastFormatElement) {
  690. OracleDateFormat.FormatElementList = OracleDateFormat.FormatElementList[:len(OracleDateFormat.FormatElementList)-2]
  691. }
  692. }
  693. OracleDateFormat.FormatElementList = append(OracleDateFormat.FormatElementList, element)
  694. if i == len(subPattern) {
  695. subPattern = ""
  696. } else {
  697. subPattern = subPattern[i:len(subPattern)]
  698. }
  699. break
  700. }
  701. }
  702. if i == 0 {
  703. // 非标识符串
  704. OracleDateFormat.FormatElementList = append(OracleDateFormat.FormatElementList, subPattern)
  705. break
  706. }
  707. }
  708. } else {
  709. OracleDateFormat.FormatElementList = append(OracleDateFormat.FormatElementList, subPattern)
  710. }
  711. }
  712. return OracleDateFormat.FormatElementList, nil
  713. }
  714. func (OracleDateFormat *oracleDateFormat) getFormatElement(word string) (element, error) {
  715. if util.StringUtil.EqualsIgnoreCase("HH", word) || util.StringUtil.EqualsIgnoreCase("HH12", word) {
  716. return OracleDateFormat.HH12Element, nil
  717. } else if util.StringUtil.EqualsIgnoreCase("HH24", word) {
  718. return OracleDateFormat.HH24Element, nil
  719. } else if util.StringUtil.EqualsIgnoreCase("MI", word) {
  720. return OracleDateFormat.MIElement, nil
  721. } else if util.StringUtil.EqualsIgnoreCase("SS", word) {
  722. return OracleDateFormat.SSElement, nil
  723. } else if util.StringUtil.EqualsIgnoreCase("AM", word) || util.StringUtil.EqualsIgnoreCase("A.M.", word) || util.StringUtil.EqualsIgnoreCase("PM", word) || util.StringUtil.EqualsIgnoreCase("P.M.", word) {
  724. return OracleDateFormat.AMElement, nil
  725. } else if util.StringUtil.Equals("MONTH", word) {
  726. OracleDateFormat.MonthElement.upperCase = true
  727. OracleDateFormat.MonthElement.lowerCase = false
  728. return OracleDateFormat.MonthElement, nil
  729. } else if util.StringUtil.Equals("month", word) {
  730. OracleDateFormat.MonthElement.upperCase = false
  731. OracleDateFormat.MonthElement.lowerCase = true
  732. return OracleDateFormat.MonthElement, nil
  733. } else if util.StringUtil.EqualsIgnoreCase("Month", word) {
  734. OracleDateFormat.MonthElement.upperCase = false
  735. OracleDateFormat.MonthElement.lowerCase = false
  736. return OracleDateFormat.MonthElement, nil
  737. } else if util.StringUtil.Equals("MON", word) {
  738. OracleDateFormat.MonElement.upperCase = true
  739. OracleDateFormat.MonElement.lowerCase = false
  740. return OracleDateFormat.MonElement, nil
  741. } else if util.StringUtil.Equals("mon", word) {
  742. OracleDateFormat.MonElement.upperCase = false
  743. OracleDateFormat.MonElement.lowerCase = true
  744. return OracleDateFormat.MonElement, nil
  745. } else if util.StringUtil.EqualsIgnoreCase("Mon", word) {
  746. OracleDateFormat.MonElement.upperCase = false
  747. OracleDateFormat.MonElement.lowerCase = false
  748. return OracleDateFormat.MonElement, nil
  749. } else if util.StringUtil.EqualsIgnoreCase("MM", word) {
  750. return OracleDateFormat.MMElement, nil
  751. } else if util.StringUtil.EqualsIgnoreCase("DD", word) {
  752. return OracleDateFormat.DDElement, nil
  753. } else if util.StringUtil.EqualsIgnoreCase("TZH", word) {
  754. return OracleDateFormat.TZHElement, nil
  755. } else if util.StringUtil.EqualsIgnoreCase("TZM", word) {
  756. return OracleDateFormat.TZMElement, nil
  757. } else if strings.Index(word, "Y") == 0 || strings.Index(word, "y") == 0 {
  758. OracleDateFormat.YearElement.len = len(word)
  759. return OracleDateFormat.YearElement, nil
  760. } else if strings.Index(word, "F") == 0 || strings.Index(word, "f") == 0 {
  761. word = strings.ToUpper(word)
  762. numIndex := strings.LastIndex(word, "F") + 1
  763. var count int64
  764. var err error
  765. if numIndex < len(word) {
  766. count, err = strconv.ParseInt(word[numIndex:len(word)], 10, 32)
  767. if err != nil {
  768. return nil, err
  769. }
  770. } else {
  771. count = -1
  772. }
  773. OracleDateFormat.FElement.len = int(count)
  774. return OracleDateFormat.FElement, nil
  775. }
  776. return nil, nil
  777. }