1package faker
  2
  3import (
  4	"fmt"
  5	"reflect"
  6	"time"
  7
  8	"github.com/go-faker/faker/v4/pkg/options"
  9)
 10
 11var century = []string{"I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XI", "XII", "XIII", "XIV", "XV", "XVI", "XVII", "XVIII", "XIX", "XX", "XXI"}
 12var timezones = []string{
 13	"Australia/Adelaide",
 14	"Australia/Broken_Hill",
 15	"Australia/South",
 16	"Australia/Yancowinna",
 17	"Australia/Darwin",
 18	"Australia/North",
 19	"America/Eirunepe",
 20	"America/Porto_Acre",
 21	"America/Rio_Branco",
 22	"Brazil/Acre",
 23	"Australia/Eucla",
 24	"Australia/ACT",
 25	"Australia/Canberra",
 26	"Australia/Currie",
 27	"Australia/Hobart",
 28	"Australia/Melbourne",
 29	"Australia/NSW",
 30	"Australia/Sydney",
 31	"Australia/Tasmania",
 32	"Australia/Victoria",
 33	"Australia/Brisbane",
 34	"Australia/Lindeman",
 35	"Australia/Queensland",
 36	"Asia/Kabul",
 37	"America/Anchorage",
 38	"America/Juneau",
 39	"America/Nome",
 40	"America/Sitka",
 41	"America/Yakutat",
 42	"US/Alaska",
 43	"Asia/Almaty",
 44	"America/Boa_Vista",
 45	"America/Campo_Grande",
 46	"America/Cuiaba",
 47	"America/Manaus",
 48	"America/Porto_Velho",
 49	"Asia/Yerevan",
 50	"Brazil/West",
 51	"Asia/Anadyr",
 52	"Asia/Aqtau",
 53	"Asia/Aqtobe",
 54	"America/Argentina/Buenos_Aires",
 55	"America/Argentina/Catamarca",
 56	"America/Argentina/ComodRivadavia",
 57	"America/Argentina/Cordoba",
 58	"America/Argentina/Jujuy",
 59	"America/Argentina/La_Rioja",
 60	"America/Argentina/Mendoza",
 61	"America/Argentina/Rio_Gallegos",
 62	"America/Argentina/Salta",
 63	"America/Argentina/San_Juan",
 64	"America/Argentina/San_Luis",
 65	"America/Argentina/Tucuman",
 66	"America/Argentina/Ushuaia",
 67	"America/Buenos_Aires",
 68	"America/Catamarca",
 69	"America/Cordoba",
 70	"America/Jujuy",
 71	"America/Mendoza",
 72	"America/Rosario",
 73	"America/Anguilla",
 74	"America/Antigua",
 75	"America/Aruba",
 76	"America/Barbados",
 77	"America/Blanc-Sablon",
 78	"America/Curacao",
 79	"America/Dominica",
 80	"America/Glace_Bay",
 81	"America/Goose_Bay",
 82	"America/Grand_Turk",
 83	"America/Grenada",
 84	"America/Guadeloupe",
 85	"America/Halifax",
 86	"America/Kralendijk",
 87	"America/Lower_Princes",
 88	"America/Marigot",
 89	"America/Martinique",
 90	"America/Moncton",
 91	"America/Montserrat",
 92	"America/Port_of_Spain",
 93	"America/Puerto_Rico",
 94	"America/Santo_Domingo",
 95	"America/St_Barthelemy",
 96	"America/St_Kitts",
 97	"America/St_Lucia",
 98	"America/St_Thomas",
 99	"America/St_Vincent",
100	"America/Thule",
101	"America/Tortola",
102	"America/Virgin",
103	"Asia/Aden",
104	"Asia/Baghdad",
105	"Asia/Bahrain",
106	"Asia/Kuwait",
107	"Asia/Qatar",
108	"Asia/Riyadh",
109	"Atlantic/Bermuda",
110	"Canada/Atlantic",
111	"Antarctica/Casey",
112	"Australia/Perth",
113	"Australia/West",
114	"Atlantic/Azores",
115	"Asia/Baku",
116	"Asia/Dacca",
117	"Asia/Dhaka",
118	"Asia/Brunei",
119	"America/La_Paz",
120	"America/Araguaina",
121	"America/Bahia",
122	"America/Belem",
123	"America/Fortaleza",
124	"America/Maceio",
125	"America/Recife",
126	"America/Santarem",
127	"America/Sao_Paulo",
128	"Brazil/East",
129	"Pacific/Bougainville",
130	"Asia/Thimbu",
131	"Asia/Thimphu",
132	"Africa/Blantyre",
133	"Africa/Bujumbura",
134	"Africa/Gaborone",
135	"Africa/Harare",
136	"Africa/Kigali",
137	"Africa/Lubumbashi",
138	"Africa/Lusaka",
139	"Africa/Maputo",
140	"Indian/Cocos",
141	"Africa/Algiers",
142	"Africa/Ceuta",
143	"Africa/Tunis",
144	"Arctic/Longyearbyen",
145	"Atlantic/Jan_Mayen",
146	"CET",
147	"Europe/Amsterdam",
148	"Europe/Andorra",
149	"Europe/Belgrade",
150	"Europe/Berlin",
151	"Europe/Bratislava",
152	"Europe/Brussels",
153	"Europe/Budapest",
154	"Europe/Busingen",
155	"Europe/Copenhagen",
156	"Europe/Gibraltar",
157	"Europe/Ljubljana",
158	"Europe/Luxembourg",
159	"Europe/Madrid",
160	"Europe/Malta",
161	"Europe/Monaco",
162	"Europe/Oslo",
163	"Europe/Paris",
164	"Europe/Podgorica",
165	"Europe/Prague",
166	"Europe/Rome",
167	"Europe/San_Marino",
168	"Europe/Sarajevo",
169	"Europe/Skopje",
170	"Europe/Stockholm",
171	"Europe/Tirane",
172	"Europe/Vaduz",
173	"Europe/Vatican",
174	"Europe/Vienna",
175	"Europe/Warsaw",
176	"Europe/Zagreb",
177	"Europe/Zurich",
178	"Poland",
179	"NZ-CHAT",
180	"Pacific/Chatham",
181	"Asia/Choibalsan",
182	"Pacific/Chuuk",
183	"Pacific/Truk",
184	"Pacific/Yap",
185	"Pacific/Rarotonga",
186	"America/Santiago",
187	"Antarctica/Palmer",
188	"Chile/Continental",
189	"America/Bogota",
190	"America/Bahia_Banderas",
191	"America/Belize",
192	"America/Chicago",
193	"America/Costa_Rica",
194	"America/El_Salvador",
195	"America/Guatemala",
196	"America/Havana",
197	"America/Indiana/Knox",
198	"America/Indiana/Tell_City",
199	"America/Knox_IN",
200	"America/Managua",
201	"America/Matamoros",
202	"America/Menominee",
203	"America/Merida",
204	"America/Mexico_City",
205	"America/Monterrey",
206	"America/North_Dakota/Beulah",
207	"America/North_Dakota/Center",
208	"America/North_Dakota/New_Salem",
209	"America/Rainy_River",
210	"America/Rankin_Inlet",
211	"America/Regina",
212	"America/Resolute",
213	"America/Swift_Current",
214	"America/Tegucigalpa",
215	"America/Winnipeg",
216	"Asia/Chongqing",
217	"Asia/Chungking",
218	"Asia/Harbin",
219	"Asia/Macao",
220	"Asia/Macau",
221	"Asia/Shanghai",
222	"Asia/Taipei",
223	"CST6CDT",
224	"Canada/Central",
225	"Canada/Saskatchewan",
226	"Cuba",
227	"Mexico/General",
228	"PRC",
229	"ROC",
230	"US/Central",
231	"US/Indiana-Starke",
232	"Atlantic/Cape_Verde",
233	"Indian/Christmas",
234	"Pacific/Guam",
235	"Pacific/Saipan",
236	"Antarctica/Davis",
237	"Antarctica/DumontDUrville",
238	"Chile/EasterIsland",
239	"Pacific/Easter",
240	"Africa/Asmara",
241	"Africa/Asmera",
242	"Africa/Dar_es_Salaam",
243	"Africa/Djibouti",
244	"Africa/Juba",
245	"Africa/Kampala",
246	"Africa/Khartoum",
247	"Africa/Mogadishu",
248	"Africa/Nairobi",
249	"Indian/Antananarivo",
250	"Indian/Comoro",
251	"Indian/Mayotte",
252	"America/Guayaquil",
253	"Africa/Cairo",
254	"Africa/Tripoli",
255	"Asia/Amman",
256	"Asia/Beirut",
257	"Asia/Damascus",
258	"Asia/Gaza",
259	"Asia/Hebron",
260	"Asia/Istanbul",
261	"Asia/Nicosia",
262	"EET",
263	"Egypt",
264	"Europe/Athens",
265	"Europe/Bucharest",
266	"Europe/Chisinau",
267	"Europe/Helsinki",
268	"Europe/Istanbul",
269	"Europe/Kaliningrad",
270	"Europe/Kiev",
271	"Europe/Mariehamn",
272	"Europe/Nicosia",
273	"Europe/Riga",
274	"Europe/Sofia",
275	"Europe/Tallinn",
276	"Europe/Tiraspol",
277	"Europe/Uzhgorod",
278	"Europe/Vilnius",
279	"Europe/Zaporozhye",
280	"Libya",
281	"Turkey",
282	"America/Scoresbysund",
283	"America/Atikokan",
284	"America/Cancun",
285	"America/Cayman",
286	"America/Coral_Harbour",
287	"America/Detroit",
288	"America/Fort_Wayne",
289	"America/Indiana/Indianapolis",
290	"America/Indiana/Marengo",
291	"America/Indiana/Petersburg",
292	"America/Indiana/Vevay",
293	"America/Indiana/Vincennes",
294	"America/Indiana/Winamac",
295	"America/Indianapolis",
296	"America/Iqaluit",
297	"America/Jamaica",
298	"America/Kentucky/Louisville",
299	"America/Kentucky/Monticello",
300	"America/Louisville",
301	"America/Montreal",
302	"America/Nassau",
303	"America/New_York",
304	"America/Nipigon",
305	"America/Panama",
306	"America/Pangnirtung",
307	"America/Port-au-Prince",
308	"America/Thunder_Bay",
309	"America/Toronto",
310	"Canada/Eastern",
311	"EST",
312	"EST5EDT",
313	"Jamaica",
314	"US/East-Indiana",
315	"US/Eastern",
316	"US/Michigan",
317	"Pacific/Fiji",
318	"Atlantic/Stanley",
319	"America/Noronha",
320	"Brazil/DeNoronha",
321	"Pacific/Galapagos",
322	"Pacific/Gambier",
323	"Asia/Tbilisi",
324	"America/Cayenne",
325	"Pacific/Tarawa",
326	"Africa/Abidjan",
327	"Africa/Accra",
328	"Africa/Bamako",
329	"Africa/Banjul",
330	"Africa/Bissau",
331	"Africa/Conakry",
332	"Africa/Dakar",
333	"Africa/Freetown",
334	"Africa/Lome",
335	"Africa/Monrovia",
336	"Africa/Nouakchott",
337	"Africa/Ouagadougou",
338	"Africa/Sao_Tome",
339	"Africa/Timbuktu",
340	"America/Danmarkshavn",
341	"Atlantic/Reykjavik",
342	"Atlantic/St_Helena",
343	"Eire",
344	"Etc/GMT",
345	"Etc/GMT+0",
346	"Etc/GMT-0",
347	"Etc/GMT0",
348	"Etc/Greenwich",
349	"Europe/Belfast",
350	"Europe/Dublin",
351	"Europe/Guernsey",
352	"Europe/Isle_of_Man",
353	"Europe/Jersey",
354	"Europe/London",
355	"GB",
356	"GB-Eire",
357	"GMT",
358	"GMT+0",
359	"GMT-0",
360	"GMT0",
361	"Greenwich",
362	"Iceland",
363	"Etc/GMT+1",
364	"Etc/GMT+10",
365	"Etc/GMT+11",
366	"Etc/GMT+12",
367	"Etc/GMT+2",
368	"Etc/GMT+3",
369	"Etc/GMT+4",
370	"Etc/GMT+5",
371	"Etc/GMT+6",
372	"Etc/GMT+7",
373	"Etc/GMT+8",
374	"Etc/GMT+9",
375	"Etc/GMT-1",
376	"Etc/GMT-10",
377	"Etc/GMT-11",
378	"Etc/GMT-12",
379	"Etc/GMT-13",
380	"Etc/GMT-14",
381	"Etc/GMT-2",
382	"Etc/GMT-3",
383	"Etc/GMT-4",
384	"Etc/GMT-5",
385	"Etc/GMT-6",
386	"Etc/GMT-7",
387	"Etc/GMT-8",
388	"Etc/GMT-9",
389	"Asia/Dubai",
390	"Asia/Muscat",
391	"Atlantic/South_Georgia",
392	"America/Guyana",
393	"Asia/Hong_Kong",
394	"Hongkong",
395	"Asia/Hovd",
396	"America/Adak",
397	"America/Atka",
398	"HST",
399	"Pacific/Honolulu",
400	"Pacific/Johnston",
401	"US/Aleutian",
402	"US/Hawaii",
403	"Asia/Bangkok",
404	"Asia/Ho_Chi_Minh",
405	"Asia/Phnom_Penh",
406	"Asia/Saigon",
407	"Asia/Vientiane",
408	"Indian/Chagos",
409	"Asia/Chita",
410	"Asia/Irkutsk",
411	"Asia/Tehran",
412	"Iran",
413	"Asia/Calcutta",
414	"Asia/Colombo",
415	"Asia/Jerusalem",
416	"Asia/Kolkata",
417	"Asia/Tel_Aviv",
418	"Israel",
419	"Asia/Tokyo",
420	"Japan",
421	"Asia/Bishkek",
422	"Pacific/Kosrae",
423	"Asia/Krasnoyarsk",
424	"Asia/Novokuznetsk",
425	"Asia/Pyongyang",
426	"Asia/Seoul",
427	"ROK",
428	"Australia/LHI",
429	"Australia/Lord_Howe",
430	"Pacific/Kiritimati",
431	"Asia/Magadan",
432	"Pacific/Marquesas",
433	"Antarctica/Mawson",
434	"MET",
435	"Kwajalein",
436	"Pacific/Kwajalein",
437	"Pacific/Majuro",
438	"Antarctica/Macquarie",
439	"Asia/Rangoon",
440	"Europe/Minsk",
441	"Europe/Moscow",
442	"Europe/Simferopol",
443	"Europe/Volgograd",
444	"W-SU",
445	"America/Boise",
446	"America/Cambridge_Bay",
447	"America/Chihuahua",
448	"America/Creston",
449	"America/Dawson_Creek",
450	"America/Denver",
451	"America/Edmonton",
452	"America/Fort_Nelson",
453	"America/Hermosillo",
454	"America/Inuvik",
455	"America/Mazatlan",
456	"America/Ojinaga",
457	"America/Phoenix",
458	"America/Shiprock",
459	"America/Yellowknife",
460	"Canada/Mountain",
461	"MST",
462	"MST7MDT",
463	"Mexico/BajaSur",
464	"Navajo",
465	"US/Arizona",
466	"US/Mountain",
467	"Indian/Mauritius",
468	"Indian/Maldives",
469	"Asia/Kuala_Lumpur",
470	"Asia/Kuching",
471	"Pacific/Noumea",
472	"Pacific/Norfolk",
473	"Asia/Novosibirsk",
474	"Asia/Kathmandu",
475	"Asia/Katmandu",
476	"Pacific/Nauru",
477	"America/St_Johns",
478	"Canada/Newfoundland",
479	"Pacific/Niue",
480	"Antarctica/McMurdo",
481	"Antarctica/South_Pole",
482	"NZ",
483	"Pacific/Auckland",
484	"Asia/Omsk",
485	"Asia/Oral",
486	"America/Lima",
487	"Asia/Kamchatka",
488	"Pacific/Port_Moresby",
489	"Pacific/Enderbury",
490	"Asia/Manila",
491	"Asia/Karachi",
492	"America/Miquelon",
493	"Pacific/Pohnpei",
494	"Pacific/Ponape",
495	"America/Dawson",
496	"America/Ensenada",
497	"America/Los_Angeles",
498	"America/Metlakatla",
499	"America/Santa_Isabel",
500	"America/Tijuana",
501	"America/Vancouver",
502	"America/Whitehorse",
503	"Canada/Pacific",
504	"Canada/Yukon",
505	"Mexico/BajaNorte",
506	"PST8PDT",
507	"Pacific/Pitcairn",
508	"US/Pacific",
509	"Pacific/Palau",
510	"America/Asuncion",
511	"Asia/Qyzylorda",
512	"Indian/Reunion",
513	"Antarctica/Rothera",
514	"Asia/Sakhalin",
515	"Europe/Samara",
516	"Africa/Johannesburg",
517	"Africa/Maseru",
518	"Africa/Mbabane",
519	"Pacific/Guadalcanal",
520	"Indian/Mahe",
521	"Asia/Singapore",
522	"Singapore",
523	"Asia/Srednekolymsk",
524	"America/Paramaribo",
525	"Pacific/Midway",
526	"Pacific/Pago_Pago",
527	"Pacific/Samoa",
528	"US/Samoa",
529	"Antarctica/Syowa",
530	"Pacific/Tahiti",
531	"Indian/Kerguelen",
532	"Asia/Dushanbe",
533	"Pacific/Fakaofo",
534	"Asia/Dili",
535	"Asia/Ashgabat",
536	"Asia/Ashkhabad",
537	"Pacific/Tongatapu",
538	"Pacific/Funafuti",
539	"Etc/UCT",
540	"UCT",
541	"Asia/Ulaanbaatar",
542	"Asia/Ulan_Bator",
543	"Antarctica/Troll",
544	"Etc/UTC",
545	"Etc/Universal",
546	"Etc/Zulu",
547	"UTC",
548	"Universal",
549	"Zulu",
550	"America/Montevideo",
551	"Asia/Samarkand",
552	"Asia/Tashkent",
553	"America/Caracas",
554	"Asia/Ust-Nera",
555	"Asia/Vladivostok",
556	"Antarctica/Vostok",
557	"Pacific/Efate",
558	"Pacific/Wake",
559	"Africa/Windhoek",
560	"Africa/Bangui",
561	"Africa/Brazzaville",
562	"Africa/Douala",
563	"Africa/Kinshasa",
564	"Africa/Lagos",
565	"Africa/Libreville",
566	"Africa/Luanda",
567	"Africa/Malabo",
568	"Africa/Ndjamena",
569	"Africa/Niamey",
570	"Africa/Porto-Novo",
571	"Africa/Casablanca",
572	"Africa/El_Aaiun",
573	"Atlantic/Canary",
574	"Atlantic/Faeroe",
575	"Atlantic/Faroe",
576	"Atlantic/Madeira",
577	"Europe/Lisbon",
578	"Portugal",
579	"WET",
580	"Pacific/Wallis",
581	"America/Godthab",
582	"Asia/Jakarta",
583	"Asia/Pontianak",
584	"Asia/Jayapura",
585	"Asia/Makassar",
586	"Asia/Ujung_Pandang",
587	"Pacific/Apia",
588	"Asia/Kashgar",
589	"Asia/Urumqi",
590	"Asia/Khandyga",
591	"Asia/Yakutsk",
592	"Asia/Yekaterinburg",
593}
594
595// These example values must use the reference time "Mon Jan 2 15:04:05 MST 2006"
596// as described at https://gobyexample.com/time-formatting-parsing
597const (
598	BaseDateFormat   = "2006-01-02"
599	TimeFormat       = "15:04:05"
600	MonthFormat      = "January"
601	YearFormat       = "2006"
602	DayFormat        = "Monday"
603	DayOfMonthFormat = "_2"
604	TimePeriodFormat = "PM"
605)
606
607// A DateTimer contains random Time generators, returning time string in certain particular format
608type DateTimer interface {
609	UnixTime(v reflect.Value) (interface{}, error)
610	Date(v reflect.Value) (interface{}, error)
611	Time(v reflect.Value) (interface{}, error)
612	MonthName(v reflect.Value) (interface{}, error)
613	Year(v reflect.Value) (interface{}, error)
614	DayOfWeek(v reflect.Value) (interface{}, error)
615	DayOfMonth(v reflect.Value) (interface{}, error)
616	Timestamp(v reflect.Value) (interface{}, error)
617	Century(v reflect.Value) (interface{}, error)
618	TimeZone(v reflect.Value) (interface{}, error)
619	TimePeriod(v reflect.Value) (interface{}, error)
620}
621
622// GetDateTimer returns a new DateTimer interface of DateTime
623func GetDateTimer() DateTimer {
624	date := &DateTime{}
625	return date
626}
627
628// DateTime struct
629type DateTime struct {
630}
631
632func (d DateTime) unixtime() int64 {
633	return RandomUnixTime()
634}
635
636// UnixTime get unix time
637func (d DateTime) UnixTime(v reflect.Value) (interface{}, error) {
638	kind := v.Kind()
639	var val int64
640	if kind == reflect.Int64 {
641		val = d.unixtime()
642	} else {
643		val = 0
644	}
645
646	return val, nil
647}
648
649// UnixTime get unix time randomly
650func UnixTime(opts ...options.OptionFunc) int64 {
651	return singleFakeData(UnixTimeTag, func() interface{} {
652		datetime := DateTime{}
653		return datetime.unixtime()
654	}, opts...).(int64)
655}
656
657func (d DateTime) date() string {
658	return time.Unix(RandomUnixTime(), 0).Format(BaseDateFormat)
659}
660
661// Date formats DateTime using example BaseDateFormat const
662func (d DateTime) Date(v reflect.Value) (interface{}, error) {
663	return d.date(), nil
664}
665
666// Date get fake date in string randomly
667func Date(opts ...options.OptionFunc) string {
668	return singleFakeData(DATE, func() interface{} {
669		datetime := DateTime{}
670		return datetime.date()
671	}, opts...).(string)
672}
673
674func (d DateTime) time() string {
675	return time.Unix(RandomUnixTime(), 0).Format(TimeFormat)
676}
677
678// Time formats DateTime using example Time const
679func (d DateTime) Time(v reflect.Value) (interface{}, error) {
680	return d.time(), nil
681}
682
683// TimeString get time randomly in string format
684func TimeString(opts ...options.OptionFunc) string {
685	return singleFakeData(TIME, func() interface{} {
686		datetime := DateTime{}
687		return datetime.time()
688	}, opts...).(string)
689}
690
691func (d DateTime) monthName() string {
692	return time.Unix(RandomUnixTime(), 0).Format(MonthFormat)
693}
694
695// MonthName formats DateTime using example Month const
696func (d DateTime) MonthName(v reflect.Value) (interface{}, error) {
697	return d.monthName(), nil
698}
699
700// MonthName get month name randomly in string format
701func MonthName(opts ...options.OptionFunc) string {
702	return singleFakeData(MonthNameTag, func() interface{} {
703		datetime := DateTime{}
704		return datetime.monthName()
705	}, opts...).(string)
706}
707
708func (d DateTime) year() string {
709	return time.Unix(RandomUnixTime(), 0).Format(YearFormat)
710}
711
712// Year formats DateTime using example Year const
713func (d DateTime) Year(v reflect.Value) (interface{}, error) {
714	return d.year(), nil
715}
716
717// YearString get year randomly in string format
718func YearString(opts ...options.OptionFunc) string {
719	return singleFakeData(YEAR, func() interface{} {
720		datetime := DateTime{}
721		return datetime.year()
722	}, opts...).(string)
723}
724
725func (d DateTime) dayOfWeek() string {
726	return time.Unix(RandomUnixTime(), 0).Format(DayFormat)
727}
728
729// DayOfWeek formats DateTime using example Day const
730func (d DateTime) DayOfWeek(v reflect.Value) (interface{}, error) {
731	return d.dayOfWeek(), nil
732}
733
734// DayOfWeek get day of week randomly in string format
735func DayOfWeek(opts ...options.OptionFunc) string {
736	return singleFakeData(DayOfWeekTag, func() interface{} {
737		datetime := DateTime{}
738		return datetime.dayOfWeek()
739	}, opts...).(string)
740}
741
742func (d DateTime) dayOfMonth() string {
743	return time.Unix(RandomUnixTime(), 0).Format(DayOfMonthFormat)
744}
745
746// DayOfMonth formats DateTime using example DayOfMonth const
747func (d DateTime) DayOfMonth(v reflect.Value) (interface{}, error) {
748	return d.dayOfMonth(), nil
749}
750
751// DayOfMonth get month randomly in string format
752func DayOfMonth(opts ...options.OptionFunc) string {
753	return singleFakeData(DayOfMonthTag, func() interface{} {
754		datetime := DateTime{}
755		return datetime.dayOfMonth()
756	}, opts...).(string)
757}
758
759func (d DateTime) timestamp() string {
760	return time.Unix(RandomUnixTime(), 0).Format(fmt.Sprintf("%s %s", BaseDateFormat, TimeFormat))
761}
762
763// Timestamp formats DateTime using example Timestamp const
764func (d DateTime) Timestamp(v reflect.Value) (interface{}, error) {
765	return d.timestamp(), nil
766}
767
768// Timestamp get timestamp randomly in string format: 2006-01-02 15:04:05
769func Timestamp(opts ...options.OptionFunc) string {
770	return singleFakeData(TIMESTAMP, func() interface{} {
771		datetime := DateTime{}
772		return datetime.timestamp()
773	}, opts...).(string)
774}
775
776func (d DateTime) century() string {
777	return randomElementFromSliceString(century)
778}
779
780// Century returns a random century
781func (d DateTime) Century(v reflect.Value) (interface{}, error) {
782	return d.century(), nil
783}
784
785// Century get century randomly in string
786func Century(opts ...options.OptionFunc) string {
787	return singleFakeData(CENTURY, func() interface{} {
788		datetime := DateTime{}
789		return datetime.century()
790	}, opts...).(string)
791}
792
793func (d DateTime) timezone() string {
794	return randomElementFromSliceString(timezones)
795}
796
797// TimeZone returns a random timezone
798func (d DateTime) TimeZone(v reflect.Value) (interface{}, error) {
799	return d.timezone(), nil
800}
801
802// Timezone get timezone randomly in string
803func Timezone(opts ...options.OptionFunc) string {
804	return singleFakeData(TIMEZONE, func() interface{} {
805		datetime := DateTime{}
806		return datetime.timezone()
807	}, opts...).(string)
808}
809
810func (d DateTime) period() string {
811	return time.Unix(RandomUnixTime(), 0).Format(TimePeriodFormat)
812}
813
814// TimePeriod formats DateTime using example TimePeriod const
815func (d DateTime) TimePeriod(v reflect.Value) (interface{}, error) {
816	return d.period(), nil
817}
818
819// Timeperiod get timeperiod randomly in string (AM/PM)
820func Timeperiod(opts ...options.OptionFunc) string {
821	return singleFakeData(TimePeriodTag, func() interface{} {
822		datetime := DateTime{}
823		return datetime.period()
824	}, opts...).(string)
825}
826
827// RandomUnixTime is a helper function returning random Unix time
828func RandomUnixTime() int64 {
829	return rand.Int63n(time.Now().Unix())
830}