1/********************************************************************
2 * COPYRIGHT:
3 * Copyright (c) 2008-2013, International Business Machines Corporation and
4 * others. All Rights Reserved.
5 ********************************************************************/
6//! [getBestPatternExample1]
7#include <iostream>
8#include "unicode/smpdtfmt.h"
9#include "unicode/dtptngen.h"
10#include "unicode/ustdio.h"
11//! [getBestPatternExample1]
12
13using namespace std;
14
15static void getBestPatternExample() {
16
17		u_printf("========================================================================\n");
18		u_printf(" getBestPatternExample()\n");
19        u_printf("\n");
20        u_printf(" Use DateTimePatternGenerator to create customized date/time pattern:\n");
21        u_printf(" yQQQQ,yMMMM, MMMMd, hhmm, jjmm per locale\n");
22        u_printf("========================================================================\n");
23		//! [getBestPatternExample]
24	UnicodeString skeletons [] = {
25		UnicodeString("yQQQQ"), // year + full name of quarter, i.e., 4th quarter 1999
26        UnicodeString("yMMMM"), // year + full name of month, i.e., October 1999
27        UnicodeString("MMMMd"), // full name of month + day of the month, i.e., October 25
28        UnicodeString("hhmm"),  // 12-hour-cycle format, i.e., 1:32 PM
29        UnicodeString("jjmm"), // preferred hour format for the given locale, i.e., 24-hour-cycle format for fr_FR
30		0,
31	};
32
33	Locale locales[] = {
34		Locale ("en_US"),
35		Locale ("fr_FR"),
36		Locale ("zh_CN"),
37	};
38
39	const char* filename = "sample.txt";
40	/* open a UTF-8 file for writing */
41	UFILE* f = u_fopen(filename, "w", NULL,"UTF-8");
42	UnicodeString dateReturned;
43	UErrorCode status =U_ZERO_ERROR;
44	Calendar *cal = Calendar::createInstance(status);
45	cal->set (1999,9,13,23,58,59);
46	UDate date = cal->getTime(status);
47	u_fprintf(f, "%-20S%-20S%-20S%-20S\n", UnicodeString("Skeleton").getTerminatedBuffer(),UnicodeString("en_US").getTerminatedBuffer(),UnicodeString("fr_FR").getTerminatedBuffer(),UnicodeString("zh_CN").getTerminatedBuffer());
48	for (int i=0;skeletons[i]!=NULL;i++) {
49		u_fprintf(f, "%-20S",skeletons[i].getTerminatedBuffer());
50		for (int j=0;j<sizeof(locales)/sizeof(locales[0]);j++) {
51			// create a DateTimePatternGenerator instance for given locale
52			DateTimePatternGenerator *dtfg= DateTimePatternGenerator::createInstance(locales[j],status);
53			// use getBestPattern method to get the best pattern for the given skeleton
54			UnicodeString pattern = dtfg->getBestPattern(skeletons[i],status);
55			// Constructs a SimpleDateFormat with the best pattern generated above and the given locale
56			SimpleDateFormat *sdf = new SimpleDateFormat(pattern,locales[j],status);
57			dateReturned.remove();
58			// Get the format of the given date
59			sdf->format(date,dateReturned,status);
60			/* write Unicode string to file */
61			u_fprintf(f, "%-20S", dateReturned.getTerminatedBuffer());
62			delete dtfg;
63			delete sdf;
64		}
65		u_fprintf(f,"\n");
66	}
67	/* close the file resource */
68	u_fclose(f);
69	delete cal;
70	//! [getBestPatternExample]
71	 /* output of the sample code:
72     ***********************************************************************************************************
73      Skeleton			en_US							fr_FR							zh_CN
74
75      yQQQQ				4th quarter 1999				4e trimestre 1999				1999年第四季度
76
77      yMMMM				October 1999					octobre 1999					1999年10月
78
79      MMMMd				October 13						13 octobre						10月13日
80
81	  hhmm				11:58 PM						11:58 PM						下午11:58
82
83      jjmm				11:58 PM						23:58							下午11:58
84
85     ************************************************************************************************************/
86}
87
88static void addPatternExample() {
89
90		u_printf("========================================================================\n");
91        u_printf(" addPatternExample()\n");
92		u_printf("\n");
93        u_printf(" Use addPattern API to add new '. von' to existing pattern\n");
94        u_printf("========================================================================\n");
95		//! [addPatternExample]
96		UErrorCode status =U_ZERO_ERROR;
97		UnicodeString conflictingPattern,dateReturned, pattern;
98		Locale locale=Locale::getFrance();
99		Calendar *cal = Calendar::createInstance(status);
100		cal->set (1999,9,13,23,58,59);
101		UDate date = cal->getTime(status);
102        // Create an DateTimePatternGenerator instance for the given locale
103		DateTimePatternGenerator *dtfg= DateTimePatternGenerator::createInstance(locale,status);
104		SimpleDateFormat *sdf = new SimpleDateFormat(dtfg->getBestPattern("MMMMddHmm",status),locale,status);
105        // Add '. von' to the existing pattern
106        dtfg->addPattern("dd'. von' MMMM", true, conflictingPattern,status);
107        // Apply the new pattern
108        sdf->applyPattern(dtfg->getBestPattern("MMMMddHmm",status));
109		dateReturned = sdf->format(date, dateReturned, status);
110		pattern =sdf->toPattern(pattern);
111		u_printf("%s\n", "New Pattern for FRENCH: ");
112      	u_printf("%S\n", pattern.getTerminatedBuffer());
113		u_printf("%s\n", "Date Time in new Pattern: ");
114		u_printf("%S\n", dateReturned.getTerminatedBuffer());
115		delete dtfg;
116		delete sdf;
117		delete cal;
118
119		//! [addPatternExample]
120        /* output of the sample code:
121        ************************************************************************************************
122         New Pattern for FRENCH: dd. 'von' MMMM HH:mm
123         Date Time in new Pattern: 13. von octobre 23:58
124
125        *************************************************************************************************/
126 	}
127
128static void replaceFieldTypesExample() {
129		// Use repalceFieldTypes API to replace zone 'zzzz' with 'vvvv'
130       u_printf("========================================================================\n");
131       u_printf(" replaceFieldTypeExample()\n");
132       u_printf("\n");
133       u_printf(" Use replaceFieldTypes API to replace zone 'zzzz' with 'vvvv'\n");
134       u_printf("========================================================================\n");
135	   //! [replaceFieldTypesExample]
136		UFILE *out = u_finit(stdout, NULL, "UTF-8");
137		UErrorCode status =U_ZERO_ERROR;
138		UnicodeString pattern,dateReturned;
139		Locale locale =Locale::getFrance();
140		Calendar *cal = Calendar::createInstance(status);
141		cal->set (1999,9,13,23,58,59);
142		UDate date = cal->getTime(status);
143		TimeZone *zone = TimeZone::createTimeZone(UnicodeString("Europe/Paris"));
144		DateTimePatternGenerator *dtfg = DateTimePatternGenerator::createInstance(locale,status);
145	    SimpleDateFormat *sdf = new SimpleDateFormat("EEEE d MMMM y HH:mm:ss zzzz",locale,status);
146		sdf->setTimeZone(*zone);
147		pattern = sdf->toPattern(pattern);
148		u_fprintf(out, "%S\n", UnicodeString("Pattern before replacement:").getTerminatedBuffer());
149      	u_fprintf(out, "%S\n", pattern.getTerminatedBuffer());
150		dateReturned.remove();
151		dateReturned = sdf->format(date, dateReturned, status);
152		u_fprintf(out, "%S\n", UnicodeString("Date/Time format in fr_FR:").getTerminatedBuffer());
153		u_fprintf(out, "%S\n", dateReturned.getTerminatedBuffer());
154        // Replace zone "zzzz" in the pattern with "vvvv"
155		UnicodeString newPattern = dtfg->replaceFieldTypes(pattern, "vvvv", status);
156		// Apply the new pattern
157		sdf->applyPattern(newPattern);
158		dateReturned.remove();
159		dateReturned = sdf->format(date, dateReturned, status);
160		u_fprintf(out, "%S\n", UnicodeString("Pattern after replacement:").getTerminatedBuffer());
161     	u_fprintf(out, "%S\n", newPattern.getTerminatedBuffer());
162     	u_fprintf(out, "%S\n", UnicodeString("Date/Time format in fr_FR:").getTerminatedBuffer());
163		u_fprintf(out, "%S\n", dateReturned.getTerminatedBuffer());
164		delete sdf;
165		delete dtfg;
166		delete zone;
167		delete cal;
168		u_fclose(out);
169
170		//! [replaceFieldTypesExample]
171		/* output of the sample code:
172        *************************************************************************************************
173         Pattern before replacement:
174         EEEE d MMMM y HH:mm:ss zzzz
175         Date/Time format in fr_FR:
176         jeudi 14 octobre 1999 05:58:59 heure avancée d’Europe centrale
177         Pattern after replacement:
178         EEEE d MMMM y HH:mm:ss vvvv
179         Date/Time format in fr_FR:
180         jeudi 14 octobre 1999 05:58:59 heure de l’Europe centrale
181
182        *************************************************************************************************/
183    }
184
185int main (int argc, char* argv[])
186{
187	getBestPatternExample();
188	addPatternExample();
189	replaceFieldTypesExample();
190	return 0;
191}
192