zoukankan      html  css  js  c++  java
  • 日期与编码杂记

    做一个下载的功能,但始终乱码,怎么调也好不了,返回ResponseEntity前打印内容正常,并且mock的测试返回的也正常

    RequestBuilder request = MockMvcRequestBuilders.get("/export");
    String res = mockMvc.perform(request).andExpect(status().isOk()).andReturn().getResponse().getContentAsString();

    后来发现原来是springboot在解析string类型的时候不对,解决方法如下:

    增加对byte和string的解析器

    @Configuration
    public class MyWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter {
        private static final Logger logger = LoggerFactory.getLogger(MyWebMvcConfigurerAdapter.class);
        @Override
        public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
            super.configureMessageConverters(converters);
            logger.info("add string and byte array converter");
            StringHttpMessageConverter stringConverter = new StringHttpMessageConverter();
            stringConverter.setDefaultCharset(Charset.forName("UTF-8"));
            converters.add(stringConverter);
            converters.add(new ByteArrayHttpMessageConverter());
        }
    }

    还要注意的是,在做下载的时候

    文件名乱码解决方法

    new String(fileName.getBytes("UTF-8"), "iso-8859-1")

    CSV类型下载需要添加头信息

    HttpHeaders headers = new HttpHeaders();
    headers.set("Content-disposition", "attachment; filename=" + fileName);
    headers.set("Content-type", "text/plain;charset=UTF-8");
    response = new ResponseEntity<String>("uFEFF" + file, headers, HttpStatus.OK);

    其他编码注意事项:见内容及结果串

            //windows自身采用的编码格式是gbk(而gbk和gb2312基本上是一样的编码方式),而IDE中Encode不修改的话,默认是utf-8的编码
            //        File file = new File("中文文件名.csv");
            //        //流编码测试,文件中文内容
            //        OutputStreamWriter bis = new OutputStreamWriter(new FileOutputStream(file), "gbk");
            //        BufferedWriter bw = new BufferedWriter(bis);
            //        bw.write("文件中文内容");
            //        bw.flush();
            //-------------------------------------------------------------------------------------
            //        File file1 = new File("中文文件名.csv");
            //        //流编码测试,鏂囦欢涓�枃鍐呭�
            //        OutputStreamWriter bis1 = new OutputStreamWriter(new FileOutputStream(file1), "utf-8");
            //        BufferedWriter bw1 = new BufferedWriter(bis1);
            //        bw1.write("文件中文内容");
            //        bw1.flush();
            //-------------------------------------------------------------------------------------
            //        File file1 = new File("中文文件名.csv");
            //        //流编码测试,??????
            //        OutputStreamWriter bis1 = new OutputStreamWriter(new FileOutputStream(file1), "iso-8859-1");
            //        BufferedWriter bw1 = new BufferedWriter(bis1);
            //        bw1.write("文件中文内容");
            //        bw1.flush();
            //-------------------------------------------------------------------------------------
            //        File file1 = new File("中文文件名.csv");
            //        //流编码测试,文件中文内容
            //        OutputStreamWriter bis1 = new OutputStreamWriter(new FileOutputStream(file1), "gb2312");
            //        BufferedWriter bw1 = new BufferedWriter(bis1);
            //        bw1.write("文件中文内容");
            //        bw1.flush();

    日期问题:

    Long类型,分为秒的和毫秒的,注意区分

    String类型,分为UTC类型和一般日期类型

    UTC类型举例:https://zhidao.baidu.com/question/585516457.html 这个牵扯到时区,要注意可能这里不对

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
    Date date = sdf.parse(begin);

     一般日期类型举例:

    DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date date = sdf.parse(dateString);  

    日期转String

    String dateStr = df.format(new Date());
    long longTime = new Date().getTime();
    System.out.println("字符串类型的Long日期转换成日期:");
    String str = "1498457677473";
    Long dateLong = Long.valueOf(str);
    System.out.println("longToDate:"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(dateLong)));
    
    System.out.println("Date和Long互转:");
    System.out.println("日期转换成Long:"+longTime);
    System.out.println("Long转换成日期:"+new Date(longTime));
  • 相关阅读:
    Directx11学习笔记【九】 【转】 3D渲染管线
    排序算法总结
    [LeetCode92]Reverse Linked List II
    c++析构函数为什么要为虚函数
    简析iOS动画原理及实现——Core Animation
    Xcode 插件集:xTextHandler
    [iOS] 在 ios10 中使用 imessage
    UITableView-FDTemplateLayoutCell 学习笔记
    Xcode 7.3 cannot create __weak reference in file using manual reference counting
    iOS10个实用小技巧(总有你不知道的和你会用到的)
  • 原文地址:https://www.cnblogs.com/it-worker365/p/9792632.html
Copyright © 2011-2022 走看看