分類: 3C資訊

  • 基於 abp vNext 和 .NET Core 開發博客項目 – Blazor 實戰系列(四)

    基於 abp vNext 和 .NET Core 開發博客項目 – Blazor 實戰系列(四)

    系列文章

    1. 基於 abp vNext 和 .NET Core 開發博客項目 – 使用 abp cli 搭建項目
    2. 基於 abp vNext 和 .NET Core 開發博客項目 – 給項目瘦身,讓它跑起來
    3. 基於 abp vNext 和 .NET Core 開發博客項目 – 完善與美化,Swagger登場
    4. 基於 abp vNext 和 .NET Core 開發博客項目 – 數據訪問和代碼優先
    5. 基於 abp vNext 和 .NET Core 開發博客項目 – 自定義倉儲之增刪改查
    6. 基於 abp vNext 和 .NET Core 開發博客項目 – 統一規範API,包裝返回模型
    7. 基於 abp vNext 和 .NET Core 開發博客項目 – 再說Swagger,分組、描述、小綠鎖
    8. 基於 abp vNext 和 .NET Core 開發博客項目 – 接入GitHub,用JWT保護你的API
    9. 基於 abp vNext 和 .NET Core 開發博客項目 – 異常處理和日誌記錄
    10. 基於 abp vNext 和 .NET Core 開發博客項目 – 使用Redis緩存數據
    11. 基於 abp vNext 和 .NET Core 開發博客項目 – 集成Hangfire實現定時任務處理
    12. 基於 abp vNext 和 .NET Core 開發博客項目 – 用AutoMapper搞定對象映射
    13. 基於 abp vNext 和 .NET Core 開發博客項目 – 定時任務最佳實戰(一)
    14. 基於 abp vNext 和 .NET Core 開發博客項目 – 定時任務最佳實戰(二)
    15. 基於 abp vNext 和 .NET Core 開發博客項目 – 定時任務最佳實戰(三)
    16. 基於 abp vNext 和 .NET Core 開發博客項目 – 博客接口實戰篇(一)
    17. 基於 abp vNext 和 .NET Core 開發博客項目 – 博客接口實戰篇(二)
    18. 基於 abp vNext 和 .NET Core 開發博客項目 – 博客接口實戰篇(三)
    19. 基於 abp vNext 和 .NET Core 開發博客項目 – 博客接口實戰篇(四)
    20. 基於 abp vNext 和 .NET Core 開發博客項目 – 博客接口實戰篇(五)
    21. 基於 abp vNext 和 .NET Core 開發博客項目 – Blazor 實戰系列(一)
    22. 基於 abp vNext 和 .NET Core 開發博客項目 – Blazor 實戰系列(二)
    23. 基於 abp vNext 和 .NET Core 開發博客項目 – Blazor 實戰系列(三)
    24. 基於 abp vNext 和 .NET Core 開發博客項目 – Blazor 實戰系列(四)
    25. 基於 abp vNext 和 .NET Core 開發博客項目 – Blazor 實戰系列(五)
    26. 基於 abp vNext 和 .NET Core 開發博客項目 – Blazor 實戰系列(六)
    27. 基於 abp vNext 和 .NET Core 開發博客項目 – Blazor 實戰系列(七)
    28. 基於 abp vNext 和 .NET Core 開發博客項目 – Blazor 實戰系列(八)
    29. 基於 abp vNext 和 .NET Core 開發博客項目 – Blazor 實戰系列(九)
    30. 基於 abp vNext 和 .NET Core 開發博客項目 – 終結篇之發布項目

    上一篇完成了博客的分頁查詢文章列表頁面的數據綁定和分頁功能,本篇將繼續完成剩下的幾個頁面。

    在開始主題之前重新解決上一篇的最後一個問題,當點擊了頭部組件的/posts鏈接時直接強制刷新了頁面,經過查看文檔和實踐有了更好的解決方案。

    先將頭部組件Header.razor中的NavLink恢復成<NavLink class="menu-item" href="posts">Posts</NavLink>,不需要點擊事件了。

    然後在Posts.razor中添加生命周期函數OnParametersSetAsync(),在初始化完成后執行。

    /// <summary>
    /// 初始化完成后執行
    /// </summary>
    /// <returns></returns>
    protected override async Task OnParametersSetAsync()
    {
        if (!page.HasValue)
        {
            page = 1;
            await RenderPage(page);
        }
    }
    

    判斷當前page參數是否有值,有值的話說明請求肯定是來自於翻頁,當page沒有值的時候就說明是頭部的菜單點進來的。那麼此時給page賦值為1,調用API加載數據即可。

    分類列表

    Categories.razor是分類列表頁面,上篇文章已經實現了從API獲取數據的方法,所以這裏就很簡單了,指定接受類型,然後在生命周期初始化OnInitializedAsync()中去獲取數據。

    @code{
        /// <summary>
        /// categories
        /// </summary>
        private ServiceResult<IEnumerable<QueryCategoryDto>> categories;
    
        /// <summary>
        /// 初始化
        /// </summary>
        protected override async Task OnInitializedAsync()
        {
            // 獲取數據
            categories = await Http.GetFromJsonAsync<ServiceResult<IEnumerable<QueryCategoryDto>>>($"/blog/categories");
        }
    }
    

    當獲取到數據的時候進行綁定,沒有數據的時候還是显示加載中的組件<Loading />讓他轉圈圈。

    @if (categories == null)
    {
        <Loading />
    }
    else
    {
        <div class="container">
            <div class="post-wrap categories">
                <h2 class="post-title">-&nbsp;Categories&nbsp;-</h2>
                <div class="categories-card">
                    @if (categories.Success && categories.Result.Any())
                    {
                        @foreach (var item in categories.Result)
                        {
                            <div class="card-item">
                                <div class="categories">
                                    <a href="/category/@item.DisplayName/">
                                        <h3>
                                            <i class="iconfont iconcode" style="padding-right:3px"></i>
                                            @item.CategoryName
                                        </h3>
                                        <small>(@item.Count)</small>
                                    </a>
                                </div>
                            </div>
                        }
                    }
                    else
                    {
                        <ErrorTip />
                    }
                </div>
            </div>
        </div>
    }
    

    直接循環返回的數據列表categories.Result,綁定數據就好,當獲取失敗或者沒有返回數據的時候显示錯誤提示組件<ErrorTip />

    標籤列表

    Categories.razor是標籤列表頁面,和分類列表HTML結構差不多一樣的,除了返回類型和接口地址不一樣,將上面代碼複製過來改改即可。

    @code{
        /// <summary>
        /// tags
        /// </summary>
        private ServiceResult<IEnumerable<QueryTagDto>> tags;
    
        /// <summary>
        /// 初始化
        /// </summary>
        protected override async Task OnInitializedAsync()
        {
            // 獲取數據
            tags = await Http.GetFromJsonAsync<ServiceResult<IEnumerable<QueryTagDto>>>($"/blog/tags");
        }
    }
    
    @if (tags == null)
    {
        <Loading />
    }
    else
    {
        <div class="container">
            <div class="post-wrap tags">
                <h2 class="post-title">-&nbsp;Tags&nbsp;-</h2>
                <div class="tag-cloud-tags">
                    @if (tags.Success && tags.Result.Any())
                    {
                        @foreach (var item in tags.Result)
                        {
                            <a href="/tag/@item.DisplayName/">@item.TagName<small>(@item.Count)</small></a>
                        }
                    }
                    else
                    {
                        <ErrorTip />
                    }
                </div>
            </div>
        </div>
    }
    

    友鏈列表

    FriendLinks.razor是友情鏈接列表頁面,實現方式和上面兩個套路一模一樣。

    @code {
        /// <summary>
        /// friendlinks
        /// </summary>
        private ServiceResult<IEnumerable<FriendLinkDto>> friendlinks;
    
        /// <summary>
        /// 初始化
        /// </summary>
        protected override async Task OnInitializedAsync()
        {
            // 獲取數據
            friendlinks = await Http.GetFromJsonAsync<ServiceResult<IEnumerable<FriendLinkDto>>>($"/blog/friendlinks");
        }
    }
    
    @if (friendlinks == null)
    {
        <Loading />
    }
    else
    {
        <div class="container">
            <div class="post-wrap categories">
                <h2 class="post-title">-&nbsp;FriendLinks&nbsp;-</h2>
                <div class="categories-card">
                    @if (friendlinks.Success && friendlinks.Result.Any())
                    {
                        @foreach (var item in friendlinks.Result)
                        {
                            <div class="card-item">
                                <div class="categories">
                                    <a target="_blank" href="@item.LinkUrl">
                                        <h3>@item.Title</h3>
                                    </a>
                                </div>
                            </div>
                        }
                    }
                    else
                    {
                        <ErrorTip />
                    }
                </div>
            </div>
        </div>
    }
    

    文章列表(分類)

    Posts.Category.razor是根據分類查詢文章列表頁面,他接受一個參數name,我們要根據name去API查詢數據然後綁定頁面即可。

    這裏的參數name實際上就是從標籤列表傳遞過來的DisplayName的值,它是一個比較友好的名稱,我們還要通過這個值去查詢真正的分類名稱進行展示,所以這裏需要調用兩個API,這點在設計API的時候沒有考慮好,我們其實可以將這兩個API合併變成一個,後續再進行優化吧,這裏就請求兩次。

    添加兩個接收參數:分類名稱和返回的文章列表數據。

    /// <summary>
    /// 分類名稱
    /// </summary>
    private string categoryName;
    
    /// <summary>
    /// 文章列表數據
    /// </summary>
    private ServiceResult<IEnumerable<QueryPostDto>> posts;
    

    然後在OnInitializedAsync()初始化方法中調用API獲取數據,賦值給變量。

    /// <summary>
    /// 初始化
    /// </summary>
    protected override async Task OnInitializedAsync()
    {
        // TODO:獲取數據,可以在API中合併這兩個請求。
        var category = await Http.GetFromJsonAsync<ServiceResult<string>>($"/blog/category?name={name}");
        posts = await Http.GetFromJsonAsync<ServiceResult<IEnumerable<QueryPostDto>>>($"/blog/posts/category?name={name}");
    
        if (category.Success)
        {
            categoryName = category.Result;
        }
    }
    

    有了數據,直接在頁面上進行循環綁定。

    @if (posts == null)
    {
        <Loading />
    }
    else
    {
        <div class="container">
            <div class="post-wrap tags">
                @if (categoryName != null)
                {
                    <h2 class="post-title">-&nbsp;Category&nbsp;·&nbsp;@categoryName&nbsp;-</h2>
                }
            </div>
            <div class="post-wrap archive">
                @if (posts.Success && posts.Result.Any())
                {
                    @foreach (var item in posts.Result)
                    {
                        <h3>@item.Year</h3>
                        @foreach (var post in item.Posts)
                        {
                            <article class="archive-item">
                                <NavLink href="@("/post"+post.Url)">@post.Title</NavLink>
                                <span class="archive-item-date">@post.CreationTime</span>
                            </article>
                        }
                    }
                }
                else
                {
                    <ErrorTip />
                }
            </div>
        </div>
    }
    

    文章列表(標籤)

    Posts.Tag.razor是根據標籤查詢文章列表,這個和分類查詢文章列表實現方式一樣,直接上代碼。

    @code {
        /// <summary>
        /// 標籤名稱參數
        /// </summary>
        [Parameter]
        public string name { get; set; }
    
        /// <summary>
        /// 標籤名稱
        /// </summary>
        private string tagName;
    
        /// <summary>
        /// 文章列表數據
        /// </summary>
        private ServiceResult<IEnumerable<QueryPostDto>> posts;
    
        /// <summary>
        /// 初始化
        /// </summary>
        protected override async Task OnInitializedAsync()
        {
            // TODO:獲取數據,可以在API中合併這兩個請求。
            var tag = await Http.GetFromJsonAsync<ServiceResult<string>>($"/blog/tag?name={name}");
            posts = await Http.GetFromJsonAsync<ServiceResult<IEnumerable<QueryPostDto>>>($"/blog/posts/tag?name={name}");
    
            if (tag.Success)
            {
                tagName = tag.Result;
            }
        }
    }
    
    @if (posts == null)
    {
        <Loading />
    }
    else
    {
        <div class="container">
            <div class="post-wrap tags">
                @if (tagName != null)
                {
                    <h2 class="post-title">-&nbsp;Tag&nbsp;·&nbsp;@tagName&nbsp;-</h2>
                }
            </div>
            <div class="post-wrap archive">
                @if (posts.Success && posts.Result.Any())
                {
                    @foreach (var item in posts.Result)
                    {
                        <h3>@item.Year</h3>
                        @foreach (var post in item.Posts)
                        {
                            <article class="archive-item">
                                <NavLink href="@("/post"+post.Url)">@post.Title</NavLink>
                                <span class="archive-item-date">@post.CreationTime</span>
                            </article>
                        }
                    }
                }
                else
                {
                    <ErrorTip />
                }
            </div>
        </div>
    }
    

    以上完成了以上幾個頁面的數據綁定,頁面之間的跳轉已經關聯起來了,然後還剩下文章詳情頁,大家可以先自己動手完成它,今天就到這裏,未完待續…

    開源地址:https://github.com/Meowv/Blog/tree/blog_tutorial

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※別再煩惱如何寫文案,掌握八大原則!

    網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

    ※超省錢租車方案

    ※教你寫出一流的銷售文案?

    網頁設計最專業,超強功能平台可客製化

    ※產品缺大量曝光嗎?你需要的是一流包裝設計!

  • 小師妹學JavaIO之:MappedByteBuffer多大的文件我都裝得下

    小師妹學JavaIO之:MappedByteBuffer多大的文件我都裝得下

    目錄

    • 簡介
    • 虛擬地址空間
    • 詳解MappedByteBuffer
      • MapMode
    • MappedByteBuffer的最大值
    • MappedByteBuffer的使用
    • MappedByteBuffer要注意的事項
    • 總結

    簡介

    大大大,我要大!小師妹要讀取的文件越來越大,該怎麼幫幫她,讓程序在性能和速度上面得到平衡呢?快來跟F師兄一起看看吧。

    虛擬地址空間

    小師妹:F師兄,你有沒有發現,最近硬盤的價格真的是好便宜好便宜,1T的硬盤大概要500塊,平均1M五毛錢。現在下個電影都1G起步,這是不是意味着我們買入了大數據時代?

    沒錯,小師妹,硬件技術的進步也帶來了軟件技術的進步,兩者相輔相成,缺一不可。

    小師妹:F師兄,如果要是去讀取G級的文件,有沒有什麼快捷簡單的方法?

    更多精彩內容且看:

    • 區塊鏈從入門到放棄系列教程-涵蓋密碼學,超級賬本,以太坊,Libra,比特幣等持續更新
    • Spring Boot 2.X系列教程:七天從無到有掌握Spring Boot-持續更新
    • Spring 5.X系列教程:滿足你對Spring5的一切想象-持續更新
    • java程序員從小工到專家成神之路(2020版)-持續更新中,附詳細文章教程

    還記得上次我們講的虛擬地址空間嗎?

    再把上次講的圖搬過來:

    通常來說我們的應用程序調用系統的接口從磁盤空間獲取Buffer數據,我們把自己的應用程序稱之為用戶空間,把系統的底層稱之為系統空間。

    傳統的IO操作,是操作系統講磁盤中的文件讀入到系統空間裏面,然後再拷貝到用戶空間中,供用戶使用。

    這中間多了一個Buffer拷貝的過程,如果這個量夠大的話,其實還是挺浪費時間的。

    於是有人在想了,拷貝太麻煩太耗時了,我們單獨劃出一塊內存區域,讓系統空間和用戶空間同時映射到同一塊地址不就省略了拷貝的步驟嗎?

    這個被劃出來的單獨的內存區域叫做虛擬地址空間,而不同空間到虛擬地址的映射就叫做Buffer Map。 Java中是有一個專門的MappedByteBuffer來代表這種操作。

    小師妹:F師兄,那這個虛擬地址空間和內存有什麼區別呢?有了內存還要啥虛擬地址空間?

    虛擬地址空間有兩個好處。

    第一個好處就是虛擬地址空間對於應用程序本身而言是獨立的,從而保證了程序的互相隔離和程序中地址的確定性。比如說一個程序如果運行在虛擬地址空間中,那麼它的空間地址是固定的,不管他運行多少次。如果直接使用內存地址,那麼可能這次運行的時候內存地址可用,下次運行的時候內存地址不可用,就會導致潛在的程序出錯。

    第二個好處就是虛擬空間地址可以比真實的內存地址大,這個大其實是對內存的使用做了優化,比如說會把很少使用的內存寫如磁盤,從而釋放出更多的內存來做更有意義的事情,而之前存儲到磁盤的數據,當真正需要的時候,再從磁盤中加載到內存中。

    這樣物理內存實際上可以看做虛擬空間地址的緩存。

    詳解MappedByteBuffer

    小師妹:MappedByteBuffer聽起來好神奇,怎麼使用它呢?

    我們先來看看MappedByteBuffer的定義:

    public abstract class MappedByteBuffer
        extends ByteBuffer
    

    它實際上是一個抽象類,具體的實現有兩個:

    class DirectByteBuffer extends MappedByteBuffer implements DirectBuffer
    
    class DirectByteBufferR extends DirectByteBuffer
    implements DirectBuffer
    

    分別是DirectByteBuffer和DirectByteBufferR。

    小師妹:F師兄,這兩個ByteBuffer有什麼區別呢?這個R是什麼意思?

    R代表的是ReadOnly的意思,可能是因為本身是個類的名字就夠長了,所以搞了個縮寫。但是也不寫個註解,讓人看起來十分費解….

    我們可以從RandomAccessFile的FilChannel中調用map方法獲得它的實例。

    我們看下map方法的定義:

     public abstract MappedByteBuffer map(MapMode mode, long position, long size)
            throws IOException;
    

    MapMode代表的是映射的模式,position表示是map開始的地址,size表示是ByteBuffer的大小。

    MapMode

    小師妹:F師兄,文件有隻讀,讀寫兩種模式,是不是MapMode也包含這兩類?

    對的,其實NIO中的MapMode除了這兩個之外,還有一些其他很有趣的用法。

    • FileChannel.MapMode.READ_ONLY 表示只讀模式
    • FileChannel.MapMode.READ_WRITE 表示讀寫模式
    • FileChannel.MapMode.PRIVATE 表示copy-on-write模式,這個模式和READ_ONLY有點相似,它的操作是先對原數據進行拷貝,然後可以在拷貝之後的Buffer中進行讀寫。但是這個寫入並不會影響原數據。可以看做是數據的本地拷貝,所以叫做Private。

    基本的MapMode就這三種了,其實除了基礎的MapMode,還有兩種擴展的MapMode:

    • ExtendedMapMode.READ_ONLY_SYNC 同步的讀
    • ExtendedMapMode.READ_WRITE_SYNC 同步的讀寫

    MappedByteBuffer的最大值

    小師妹:F師兄,既然可以映射到虛擬內存空間,那麼這個MappedByteBuffer是不是可以無限大?

    當然不是了,首先虛擬地址空間的大小是有限制的,如果是32位的CPU,那麼一個指針佔用的地址就是4個字節,那麼能夠表示的最大值是0xFFFFFFFF,也就是4G。

    另外我們看下map方法中size的類型是long,在java中long能夠表示的最大值是0x7fffffff,也就是2147483647字節,換算一下大概是2G。也就是說MappedByteBuffer的最大值是2G,一次最多只能map 2G的數據。

    MappedByteBuffer的使用

    小師妹,F師兄我們來舉兩個使用MappedByteBuffer讀寫的例子吧。

    善!

    先看一下怎麼使用MappedByteBuffer來讀數據:

    public void readWithMap() throws IOException {
            try (RandomAccessFile file = new RandomAccessFile(new File("src/main/resources/big.www.flydean.com"), "r"))
            {
                //get Channel
                FileChannel fileChannel = file.getChannel();
                //get mappedByteBuffer from fileChannel
                MappedByteBuffer buffer = fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, fileChannel.size());
                // check buffer
                log.info("is Loaded in physical memory: {}",buffer.isLoaded());  //只是一個提醒而不是guarantee
                log.info("capacity {}",buffer.capacity());
                //read the buffer
                for (int i = 0; i < buffer.limit(); i++)
                {
                    log.info("get {}", buffer.get());
                }
            }
        }
    

    然後再看一個使用MappedByteBuffer來寫數據的例子:

    public void writeWithMap() throws IOException {
            try (RandomAccessFile file = new RandomAccessFile(new File("src/main/resources/big.www.flydean.com"), "rw"))
            {
                //get Channel
                FileChannel fileChannel = file.getChannel();
                //get mappedByteBuffer from fileChannel
                MappedByteBuffer buffer = fileChannel.map(FileChannel.MapMode.READ_WRITE, 0, 4096 * 8 );
                // check buffer
                log.info("is Loaded in physical memory: {}",buffer.isLoaded());  //只是一個提醒而不是guarantee
                log.info("capacity {}",buffer.capacity());
                //write the content
                buffer.put("www.flydean.com".getBytes());
            }
        }
    

    MappedByteBuffer要注意的事項

    小師妹:F師兄,MappedByteBuffer因為使用了內存映射,所以讀寫的速度都會有所提升。那麼我們在使用中應該注意哪些問題呢?

    MappedByteBuffer是沒有close方法的,即使它的FileChannel被close了,MappedByteBuffer仍然處於打開狀態,只有JVM進行垃圾回收的時候才會被關閉。而這個時間是不確定的。

    總結

    本文再次介紹了虛擬地址空間和MappedByteBuffer的使用。

    本文的例子https://github.com/ddean2009/learn-java-io-nio

    本文作者:flydean程序那些事

    本文鏈接:http://www.flydean.com/io-nio-mappedbytebuffer/

    本文來源:flydean的博客

    歡迎關注我的公眾號:程序那些事,更多精彩等着您!

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※教你寫出一流的銷售文案?

    ※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

    ※回頭車貨運收費標準

    ※別再煩惱如何寫文案,掌握八大原則!

    ※超省錢租車方案

    ※產品缺大量曝光嗎?你需要的是一流包裝設計!

  • 【深度思考】JDK8中日期類型該如何使用?

    【深度思考】JDK8中日期類型該如何使用?

    在JDK8之前,處理日期時間,我們主要使用3個類,DateSimpleDateFormatCalendar

    這3個類在使用時都或多或少的存在一些問題,比如SimpleDateFormat不是線程安全的,

    比如DateCalendar獲取到的月份是0到11,而不是現實生活中的1到12,關於這一點,《阿里巴巴Java開發手冊》中也有提及,因為很容易犯錯:

    不過,JDK8推出了全新的日期時間處理類解決了這些問題,比如InstantLocalDateLocalTimeLocalDateTimeDateTimeFormatter,在《阿里巴巴Java開發手冊》中也推薦使用Instant

    LocalDateTimeDateTimeFormatter

    但我發現好多項目中其實並沒有使用這些類,使用的還是之前的DateSimpleDateFormatCalendar,所以本篇博客就講解下JDK8新推出的日期時間類,主要是下面幾個:

    1. Instant
    2. LocalDate
    3. LocalTime
    4. LocalDateTime
    5. DateTimeFormatter

    1. Instant

    1.1 獲取當前時間

    既然Instant可以代替Date類,那它肯定可以獲取當前時間:

    Instant instant = Instant.now();
    System.out.println(instant);
    

    輸出結果:

    2020-06-10T08:22:13.759Z

    細心的你會發現,這個時間比北京時間少了8個小時,如果要輸出北京時間,可以加上默認時區:

    System.out.println(instant.atZone(ZoneId.systemDefault()));
    

    輸出結果:

    2020-06-10T16:22:13.759+08:00[Asia/Shanghai]

    1.2 獲取時間戳

    Instant instant = Instant.now();
    
    // 當前時間戳:單位為秒
    System.out.println(instant.getEpochSecond());
    // 當前時間戳:單位為毫秒
    System.out.println(instant.toEpochMilli());
    

    輸出結果:

    1591777752

    1591777752613

    當然,也可以通過System.currentTimeMillis()獲取當前毫秒數。

    1.3 將long轉換為Instant

    1)根據秒數時間戳轉換:

    Instant instant = Instant.now();
    System.out.println(instant);
    
    long epochSecond = instant.getEpochSecond();
    System.out.println(Instant.ofEpochSecond(epochSecond));
    System.out.println(Instant.ofEpochSecond(epochSecond, instant.getNano()));
    

    輸出結果:

    2020-06-10T08:40:54.046Z

    2020-06-10T08:40:54Z

    2020-06-10T08:40:54.046Z

    2)根據毫秒數時間戳轉換:

    Instant instant = Instant.now();
    System.out.println(instant);
    
    long epochMilli = instant.toEpochMilli();
    System.out.println(Instant.ofEpochMilli(epochMilli));
    

    輸出結果:

    2020-06-10T08:43:25.607Z

    2020-06-10T08:43:25.607Z

    1.4 將String轉換為Instant

    String text = "2020-06-10T08:46:55.967Z";
    Instant parseInstant = Instant.parse(text);
    System.out.println("秒時間戳:" + parseInstant.getEpochSecond());
    System.out.println("豪秒時間戳:" + parseInstant.toEpochMilli());
    System.out.println("納秒:" + parseInstant.getNano());
    

    輸出結果:

    秒時間戳:1591778815

    豪秒時間戳:1591778815967

    納秒:967000000

    如果字符串格式不對,比如修改成2020-06-10T08:46:55.967,就會拋出java.time.format.DateTimeParseException異常,如下圖所示:

    2. LocalDate

    2.1 獲取當前日期

    使用LocalDate獲取當前日期非常簡單,如下所示:

    LocalDate today = LocalDate.now();
    System.out.println("today: " + today);
    

    輸出結果:

    today: 2020-06-10

    不用任何格式化,輸出結果就非常友好,如果使用Date,輸出這樣的格式,還得配合SimpleDateFormat指定yyyy-MM-dd進行格式化,一不小心還會出個bug,比如去年年底很火的1個bug,我當時還是截了圖的:

    這2個好友是2019/12/31關注我的,但我2020年1月2號查看時,卻显示成了2020/12/31,為啥呢?格式化日期時格式寫錯了,應該是yyyy/MM/dd,卻寫成了YYYY/MM/dd,剛好那周跨年,就显示成下一年,也就是2020年了,當時好幾個博主寫過文章解析原因,我這裏就不做過多解釋了。

    划重點:都說到這了,給大家安利下我新註冊的公眾號「申城異鄉人」,歡迎大家關注,更多原創文章等着你哦,哈哈。

    2.2 獲取年月日

    LocalDate today = LocalDate.now();
    
    int year = today.getYear();
    int month = today.getMonthValue();
    int day = today.getDayOfMonth();
    
    System.out.println("year: " + year);
    System.out.println("month: " + month);
    System.out.println("day: " + day);
    

    輸出結果:

    year: 2020

    month: 6

    day: 10

    獲取月份終於返回1到12了,不像java.util.Calendar獲取月份返回的是0到11,獲取完還得加1。

    2.3 指定日期

    LocalDate specifiedDate = LocalDate.of(2020, 6, 1);
    System.out.println("specifiedDate: " + specifiedDate);
    

    輸出結果:

    specifiedDate: 2020-06-01

    如果確定月份,推薦使用另一個重載方法,使用枚舉指定月份:

    LocalDate specifiedDate = LocalDate.of(2020, Month.JUNE, 1);
    

    2.4 比較日期是否相等

    LocalDate localDate1 = LocalDate.now();
    LocalDate localDate2 = LocalDate.of(2020, 6, 10);
    if (localDate1.equals(localDate2)) {
        System.out.println("localDate1 equals localDate2");
    }
    

    輸出結果:

    localDate1 equals localDate2

    2.5 獲取日期是本周/本月/本年的第幾天

    LocalDate today = LocalDate.now();
    
    System.out.println("Today:" + today);
    System.out.println("Today is:" + today.getDayOfWeek());
    System.out.println("今天是本周的第" + today.getDayOfWeek().getValue() + "天");
    System.out.println("今天是本月的第" + today.getDayOfMonth() + "天");
    System.out.println("今天是本年的第" + today.getDayOfYear() + "天");
    

    輸出結果:

    Today:2020-06-11

    Today is:THURSDAY

    今天是本周的第4天

    今天是本月的第11天

    今天是本年的第163天

    2.6 判斷是否為閏年

    LocalDate today = LocalDate.now();
    
    System.out.println(today.getYear() + " is leap year:" + today.isLeapYear());
    

    輸出結果:

    2020 is leap year:true

    3. LocalTime

    3.1 獲取時分秒

    如果使用java.util.Date,那代碼是下面這樣的:

    Date date = new Date();
    
    int hour = date.getHours();
    int minute = date.getMinutes();
    int second = date.getSeconds();
    
    System.out.println("hour: " + hour);
    System.out.println("minute: " + minute);
    System.out.println("second: " + second);
    

    輸出結果:

    注意事項:這幾個方法已經過期了,因此強烈不建議在項目中使用:

    如果使用java.util.Calendar,那代碼是下面這樣的:

    Calendar calendar = Calendar.getInstance();
    
    // 12小時制
    int hourOf12 = calendar.get(Calendar.HOUR);
    // 24小時制
    int hourOf24 = calendar.get(Calendar.HOUR_OF_DAY);
    int minute = calendar.get(Calendar.MINUTE);
    int second = calendar.get(Calendar.SECOND);
    int milliSecond = calendar.get(Calendar.MILLISECOND);
    
    System.out.println("hourOf12: " + hourOf12);
    System.out.println("hourOf24: " + hourOf24);
    System.out.println("minute: " + minute);
    System.out.println("second: " + second);
    System.out.println("milliSecond: " + milliSecond);
    

    輸出結果:

    注意事項:獲取小時時,有2個選項,1個返回12小時制的小時數,1個返回24小時制的小時數,因為現在是晚上8點,所以calendar.get(Calendar.HOUR)返回8,而calendar.get(Calendar.HOUR_OF_DAY)返回20。

    如果使用java.time.LocalTime,那代碼是下面這樣的:

    LocalTime localTime = LocalTime.now();
    System.out.println("localTime:" + localTime);
    
    int hour = localTime.getHour();
    int minute = localTime.getMinute();
    int second = localTime.getSecond();
    
    System.out.println("hour: " + hour);
    System.out.println("minute: " + minute);
    System.out.println("second: " + second);
    

    輸出結果:

    可以看出,LocalTime只有時間沒有日期。

    4. LocalDateTime

    4.1 獲取當前時間

    LocalDateTime localDateTime = LocalDateTime.now();
    System.out.println("localDateTime:" + localDateTime);
    

    輸出結果:

    localDateTime: 2020-06-11T11:03:21.376

    4.2 獲取年月日時分秒

    LocalDateTime localDateTime = LocalDateTime.now();
    System.out.println("localDateTime: " + localDateTime);
    
    System.out.println("year: " + localDateTime.getYear());
    System.out.println("month: " + localDateTime.getMonthValue());
    System.out.println("day: " + localDateTime.getDayOfMonth());
    System.out.println("hour: " + localDateTime.getHour());
    System.out.println("minute: " + localDateTime.getMinute());
    System.out.println("second: " + localDateTime.getSecond());
    

    輸出結果:

    4.3 增加天數/小時

    LocalDateTime localDateTime = LocalDateTime.now();
    System.out.println("localDateTime: " + localDateTime);
    
    LocalDateTime tomorrow = localDateTime.plusDays(1);
    System.out.println("tomorrow: " + tomorrow);
    
    LocalDateTime nextHour = localDateTime.plusHours(1);
    System.out.println("nextHour: " + nextHour);
    

    輸出結果:

    localDateTime: 2020-06-11T11:13:44.979

    tomorrow: 2020-06-12T11:13:44.979

    nextHour: 2020-06-11T12:13:44.979

    LocalDateTime還提供了添加年、周、分鐘、秒這些方法,這裏就不一一列舉了:

    4.4 減少天數/小時

    LocalDateTime localDateTime = LocalDateTime.now();
    System.out.println("localDateTime: " + localDateTime);
    
    LocalDateTime yesterday = localDateTime.minusDays(1);
    System.out.println("yesterday: " + yesterday);
    
    LocalDateTime lastHour = localDateTime.minusHours(1);
    System.out.println("lastHour: " + lastHour);
    

    輸出結果:

    localDateTime: 2020-06-11T11:20:38.896

    yesterday: 2020-06-10T11:20:38.896

    lastHour: 2020-06-11T10:20:38.896

    類似的,LocalDateTime還提供了減少年、周、分鐘、秒這些方法,這裏就不一一列舉了:

    4.5 獲取時間是本周/本年的第幾天

    LocalDateTime localDateTime = LocalDateTime.now();
    System.out.println("localDateTime: " + localDateTime);
    
    System.out.println("DayOfWeek: " + localDateTime.getDayOfWeek().getValue());
    System.out.println("DayOfYear: " + localDateTime.getDayOfYear());
    

    輸出結果:

    localDateTime: 2020-06-11T11:32:31.731

    DayOfWeek: 4

    DayOfYear: 163

    5. DateTimeFormatter

    JDK8中推出了java.time.format.DateTimeFormatter來處理日期格式化問題,《阿里巴巴Java開發手冊》中也是建議使用DateTimeFormatter代替SimpleDateFormat

    5.1 格式化LocalDate

    LocalDate localDate = LocalDate.now();
    
    System.out.println("ISO_DATE: " + localDate.format(DateTimeFormatter.ISO_DATE));
    System.out.println("BASIC_ISO_DATE: " + localDate.format(DateTimeFormatter.BASIC_ISO_DATE));
    System.out.println("ISO_WEEK_DATE: " + localDate.format(DateTimeFormatter.ISO_WEEK_DATE));
    System.out.println("ISO_ORDINAL_DATE: " + localDate.format(DateTimeFormatter.ISO_ORDINAL_DATE));
    

    輸出結果:

    如果提供的格式無法滿足你的需求,你還可以像以前一樣自定義格式:

    LocalDate localDate = LocalDate.now();
    
    System.out.println("yyyy/MM/dd: " + localDate.format(DateTimeFormatter.ofPattern("yyyy/MM/dd")));
    

    輸出結果:

    yyyy/MM/dd: 2020/06/11

    5.2 格式化LocalTime

    LocalTime localTime = LocalTime.now();
    System.out.println(localTime);
    System.out.println("ISO_TIME: " + localTime.format(DateTimeFormatter.ISO_TIME));
    System.out.println("HH:mm:ss: " + localTime.format(DateTimeFormatter.ofPattern("HH:mm:ss")));
    

    輸出結果:

    14:28:35.230

    ISO_TIME: 14:28:35.23

    HH:mm:ss: 14:28:35

    5.3 格式化LocalDateTime

    LocalDateTime localDateTime = LocalDateTime.now();
    System.out.println(localDateTime);
    System.out.println("ISO_DATE_TIME: " + localDateTime.format(DateTimeFormatter.ISO_DATE_TIME));
    System.out.println("ISO_DATE: " + localDateTime.format(DateTimeFormatter.ISO_DATE));
    

    輸出結果:

    2020-06-11T14:33:18.303

    ISO_DATE_TIME: 2020-06-11T14:33:18.303

    ISO_DATE: 2020-06-11

    6. 類型相互轉換

    6.1 Instant轉Date

    JDK8中,Date新增了from()方法,將Instant轉換為Date,代碼如下所示:

    Instant instant = Instant.now();
    System.out.println(instant);
    
    Date dateFromInstant = Date.from(instant);
    System.out.println(dateFromInstant);
    

    輸出結果:

    2020-06-11T06:39:34.979Z

    Thu Jun 11 14:39:34 CST 2020

    6.2 Date轉Instant

    JDK8中,Date新增了toInstant方法,將Date轉換為Instant,代碼如下所示:

    Date date = new Date();
    Instant dateToInstant = date.toInstant();
    System.out.println(date);
    System.out.println(dateToInstant);
    

    輸出結果:

    Thu Jun 11 14:46:12 CST 2020

    2020-06-11T06:46:12.112Z

    6.3 Date轉LocalDateTime

    Date date = new Date();
    Instant instant = date.toInstant();
    LocalDateTime localDateTimeOfInstant = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
    System.out.println(date);
    System.out.println(localDateTimeOfInstant);
    

    輸出結果:

    Thu Jun 11 14:51:07 CST 2020

    2020-06-11T14:51:07.904

    6.4 Date轉LocalDate

    Date date = new Date();
    Instant instant = date.toInstant();
    LocalDateTime localDateTimeOfInstant = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
    LocalDate localDate = localDateTimeOfInstant.toLocalDate();
    System.out.println(date);
    System.out.println(localDate);
    

    輸出結果:

    Thu Jun 11 14:59:38 CST 2020

    2020-06-11

    可以看出,Date是先轉換為Instant,再轉換為LocalDateTime,然後通過LocalDateTime獲取LocalDate

    6.5 Date轉LocalTime

    Date date = new Date();
    Instant instant = date.toInstant();
    LocalDateTime localDateTimeOfInstant = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
    LocalTime toLocalTime = localDateTimeOfInstant.toLocalTime();
    System.out.println(date);
    System.out.println(toLocalTime);
    

    輸出結果:

    Thu Jun 11 15:06:14 CST 2020

    15:06:14.531

    可以看出,Date是先轉換為Instant,再轉換為LocalDateTime,然後通過LocalDateTime獲取LocalTime

    6.6 LocalDateTime轉Date

    LocalDateTime localDateTime = LocalDateTime.now();
    
    Instant toInstant = localDateTime.atZone(ZoneId.systemDefault()).toInstant();
    Date dateFromInstant = Date.from(toInstant);
    System.out.println(localDateTime);
    System.out.println(dateFromInstant);
    

    輸出結果:

    2020-06-11T15:12:11.600

    Thu Jun 11 15:12:11 CST 2020

    6.7 LocalDate轉Date

    LocalDate today = LocalDate.now();
    
    LocalDateTime localDateTime = localDate.atStartOfDay();
    Instant toInstant = localDateTime.atZone(ZoneId.systemDefault()).toInstant();
    Date dateFromLocalDate = Date.from(toInstant);
    System.out.println(dateFromLocalDate);
    

    輸出結果:

    Thu Jun 11 00:00:00 CST 2020

    6.8 LocalTime轉Date

    LocalDate localDate = LocalDate.now();
    LocalTime localTime = LocalTime.now();
    
    LocalDateTime localDateTime = LocalDateTime.of(localDate, localTime);
    Instant instantFromLocalTime = localDateTime.atZone(ZoneId.systemDefault()).toInstant();
    Date dateFromLocalTime = Date.from(instantFromLocalTime);
    
    System.out.println(dateFromLocalTime);
    

    輸出結果:

    Thu Jun 11 15:24:18 CST 2020

    7. 總結

    JDK8推出了全新的日期時間類,如InstantLocaleDateLocalTimeLocalDateTimeDateTimeFormatter,設計比之前更合理,也是線程安全的。

    《阿里巴巴Java開發規範》中也推薦使用Instant代替DateLocalDateTime 代替 CalendarDateTimeFormatter 代替 SimpleDateFormat

    因此,如果條件允許,建議在項目中使用,沒有使用的,可以考慮升級下。

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※超省錢租車方案

    ※別再煩惱如何寫文案,掌握八大原則!

    ※回頭車貨運收費標準

    ※教你寫出一流的銷售文案?

    ※產品缺大量曝光嗎?你需要的是一流包裝設計!

    ※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

  • 看完這些黑科技,我覺得寶馬的真實身份其實是科技公司!

    看完這些黑科技,我覺得寶馬的真實身份其實是科技公司!

    寶馬通過一台基於全新BMW 5系的原型車展示了未來高度自動駕駛汽車極為個性化、智能化的駕駛感受。在高度自動駕駛狀態下,駕駛者的雙手和雙腳都得到了解放,無需手握方向盤和控制油門、剎車。同時,BMW實時交通信號系統還可以預測前方下一組信號燈情況,讓駕駛者更好地進行選擇。

    (拉斯維加斯/北京)2017年1月5日,一年一度的科技盛會、2017國際消費电子展在拉斯維加斯拉開帷幕。寶馬集團攜一系列前瞻理念和科技成果亮相,展現了其在智能互聯、未來汽車內部設計、控制與显示系統、自動駕駛等創新領域蓬勃的創造力。

    寶馬集團正在成為引領数字出行生活的重要力量。在其願景中,自動駕駛技術將為駕駛者帶來更多選擇和自由;豐富的智能互聯服務圍繞人的需求,將車輛與用戶的数字生活無縫對接,讓出行和生活更高效、便捷、充滿樂趣。重要的是,這些離我們的生活並不遙遠,近年在CES上亮相的手勢控制、遠程3D環視影像等,均迅速應用於量產車型,體現了寶馬在行業內的領先地位。

    這不是科幻大片,是你未來的汽車

    在CES展台,寶馬集團通過BMW i Inside Future未來內室研究項目展示出,未來配備自動駕駛技術的汽車,其座艙將根據用戶需求,在休息室、辦公室和娛樂室之間實現自由切換。

    未來,車內空間的氛圍和控制方式將取決於駕駛模式。在主動駕駛模式下,主動駕駛的功能將處於車內中心位置。在高度自動駕駛模式下,系統將显示更多的舒適、信息娛樂和通訊功能。導航系統可以推薦適合高度或完全自動駕駛的行車路線,並在到達路口時發出提醒。未來,自動駕駛將首先應用於高速或單向行駛道路。

    對人機交互模式的創新是未來車輛的重要課題。寶馬在最近的兩屆CES上都帶來了創新的人機交互系統——手勢控制和AirTouch手勢控制系統。其中手勢控制已經應用於量產的新BMW 7系和全新BMW 5系車型。今年,寶馬又帶來了BMW HoloActive觸控系統,將人機交互體驗提升至新的高度。

    BMW HoloActive觸控系統的原理與平視显示系統類似,通過反射原理在中控台位置投射出一塊“懸浮”屏幕,駕駛者通過指尖“點擊”虛擬屏幕來控制車輛,呈現出科幻大片的既視感。這套系統通過高敏感度的攝像頭捕捉駕駛者指尖的動作。在超聲波裝置的配合下,客戶的手指可以感受到輕微的壓力,模擬了傳統觸控屏的體驗,讓操作更符合人們的習慣。

    未來的車輛內,駕駛者和乘客可以各自享受音樂而不互相干擾。首次展出的音效裝置BMW Sound Curtain通過座椅頭枕發射出不同的聲音信號,為座位上的用戶提供個性化的專屬娛樂信息。一個可摺疊的大尺寸屏幕可從車內頂篷延伸出來,進一步豐富後排乘客的車內互聯生活。

    擁有一台高度互聯的自動駕駛汽車是一種怎樣的體驗?

    寶馬通過一台基於全新BMW 5系的原型車展示了未來高度自動駕駛汽車極為個性化、智能化的駕駛感受。在高度自動駕駛狀態下,駕駛者的雙手和雙腳都得到了解放,無需手握方向盤和控制油門、剎車。同時,BMW實時交通信號系統還可以預測前方下一組信號燈情況,讓駕駛者更好地進行選擇。

    在自動泊車功能展示中,抵達停車場時,車輛自動與泊車管理服務進行連接,显示屏會提示駕駛者可以使用預約的停車位。駕駛者與乘客下車后,車輛隨即啟動自動泊車功能。BMW雲端互聯將在車輛停好後向駕駛者推送提示信息。通過全新BMW 5系中首次配備的環視影像系統,用戶還可以通過BMW雲端互聯應用實時查看車輛情況。

    在自動駕駛帶來的閑暇時間里,駕駛者可以盡情享受豐富的智能互聯功能。例如,在車輛行進途中,前排乘客可以通過BMW增強手勢控制系統、獲取途經場所的信息,如娛樂場所的節目單,還可以直接訂票。

    在開放式移動雲的支持下,BMW 雲端互聯可以整合豐富的應用,讓人們在車內便捷地處理各種事務。比如已經在家用電腦上推出的個人数字助理“微軟小娜(Cortana)”也可以在BMW汽車上使用。在駕駛過程中,用戶可以通過語音控制讓小娜推薦就餐地點並預定位置。

    通過與亞馬遜prime Now速遞服務合作,未來在行車途中預約收取快遞也成為可能。設想一下,用戶正前往一個生日聚會,但忘了購買禮物,通過這一功能,用戶可以從容地在車內在線購物。prime Now與開放式移動雲將根據車輛位置、路線和實時交通信息計算出最佳交付地點;車輛到達交付點之後,prime Now的員工將把貨物送到用戶的手中。BMW 雲端互聯無疑為智能、便捷的数字生活帶來了巨大的想象空間。BMW 雲端互聯已於2016年12月在中國正式上線,未來這些功能也將逐步升級到現有版本中。

    BMW不僅在車庫,還可以在客廳——智能出行和智能生活相結合

    在2017 CES上,寶馬集團還將全新的智能互聯科技從車內延伸到用戶的家中,標志著BMW 雲端互聯與家居環境的結合。未來,通過創新的智能終端BMW Conncted Window,用戶在家也可以享受BMW雲端互聯的豐富功能。

    當用戶開始新的一天時,BMW Connected Window的界面將显示溫暖的問候,與此同時,用戶每天的出行日程會按照時間軸進行显示,出行目的地,建議出發時間、天氣情況等信息一目瞭然。BMW Connected Window的虛擬界面通過手勢來操作,與觸摸屏一樣直觀。更新信息也可以通過BMW 雲端互聯方便地添加到日程中並與其他智能設備保持同步,幫助用戶胸有成竹地開始新一天的生活。

    本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※帶您來了解什麼是 USB CONNECTOR  ?

    ※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

    ※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

    ※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

    ※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

    ※教你寫出一流的銷售文案?

  • 吉利大法好!沃爾沃去年銷量創紀錄,換髮第二春!

    吉利大法好!沃爾沃去年銷量創紀錄,換髮第二春!

    2016年沃爾沃汽車進一步確立了在自動駕駛、電氣化及安全領域的領先地位,建立了新的商業聯盟,並不斷推出全新的產品,打造立足全球的生產製造基地。2016年沃爾沃汽車斥資5億美元在美國南卡羅來納州興建工廠,將生產基於SpA架構的車型,初期將聘用2,000餘名員工。

    沃爾沃汽車集團近日發布2016年銷售業績显示,2016年沃爾沃汽車全球共實現銷量534,332輛,同比增長6.2%,連續三年創銷量紀錄。2016年沃爾沃汽車在全球各大市場銷量齊頭並進,在中國和北美兩大市場均實現了兩位數增幅,西歐市場表現強勁,沃爾沃汽車全球復興第二階段持續加速。

    S90

    沃爾沃全新90系車型2016年銷量飄紅,其中XC90車型銷量較2015年激增了125%,印證了沃爾沃全新的設計語言及創新科技在全球取得成功,為未來沃爾沃全新車型的上市,打下堅實的基礎。同時,沃爾沃XC60車型年銷量達到161,092輛,自2008年投放市場以來,連續九年屢創銷量紀錄。

    XC90

    2016年沃爾沃汽車在中國市場銷量達90,930輛,同比增長11.5%。中國依然是沃爾沃汽車全球最大單一市場。其中,國產沃爾沃XC60和S60L是沃爾沃汽車在中國市場最暢銷的車型。

    沃爾沃汽車2016年在美國市場銷量增幅達18.1%,是美國增速最快的豪華汽車品牌之一,實現年銷量82,726輛。其中沃爾沃XC90和XC60最受美國消費者歡迎,市場表現出眾。得益於德國、英國、法國和意大利等主要市場強勁業績的推動,2016年沃爾沃汽車在西歐銷量增長4.1%,達到206,144輛。

    沃爾沃汽車2016年實現銷量破紀錄的同時,通過全球復興和品牌重新定位持續強化與其他豪華品牌的競爭優勢。2016年沃爾沃汽車進一步確立了在自動駕駛、電氣化及安全領域的領先地位,建立了新的商業聯盟,並不斷推出全新的產品,打造立足全球的生產製造基地。

    2016年沃爾沃汽車斥資5億美元在美國南卡羅來納州興建工廠,將生產基於SpA架構的車型,初期將聘用2,000餘名員工。2016年沃爾沃汽車發布了中國製造戰略,在提升產能的同時,將中國打造成了面向全球市場的生產和出口基地。沃爾沃大慶工廠生產旗艦級全新S90系家族,成都工廠生產現款60系及未來全新60系車型,基於CMA架構的全新40系車型正在規劃中,將在距上海以南350公里的路橋工廠投產。

    2016年9月,隨着沃爾沃全新V90 Cross Country旅行越界車的上市,沃爾沃全新90系車型已全部完成換代。其中XC90車型更是榮獲120多個國際大獎,充分展現了沃爾沃全新SpA架構在設計、技術等方面的領先優勢。

    V90 Cross Country

    未來幾年,沃爾沃汽車將以每年兩款全新車型的速度完成全部產品換代。2017年將推出基於SpA架構的全新XC60車型,以及基於CMA架構的首款40系產品——全新XC40車型;在新能源領域,2016年沃爾沃汽車發布了全方位的電氣化戰略,將在全系車型中引入插電式混合動力系統,並在2019年之前推出首款純電動車,到2025年將實現新能源車型累計銷量100萬輛。

    2016年沃爾沃汽車與優步(Uber)公司攜手合作開發自動駕駛技術,與瑞典奧托立夫公司(Autoliv)合作建立了合資公司——Zenuity,致力於設計和開發自動駕駛軟件及高級駕駛輔助系統,將為快速發展的全球市場提供自動駕駛軟件等服務。這也是豪華汽車品牌首次與一線供應商聯手開發相關技術,將為汽車行業帶來重大變革。

    2017年沃爾沃汽車將在瑞典總部哥德堡進一步推動Drive Me自動駕駛測試項目。作為目前全球最先進、最前沿的自動駕駛測試項目,沃爾沃汽車將提供100輛XC90自動駕駛汽車用於普通居民在真實的日常環境中出行使用。未來,沃爾沃汽車還將在中國與英國啟動DriveMe自動駕駛測試項目。

    隨着全球復興進度的加快及全新商業模式的拓展,沃爾沃汽車不僅是全球豪華汽車製造商,還將成為了一家全球高端移動出行公司。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※為什麼 USB CONNECTOR 是電子產業重要的元件?

    網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

    ※台北網頁設計公司全省服務真心推薦

    ※想知道最厲害的網頁設計公司"嚨底家"!

    ※推薦評價好的iphone維修中心

  • 車主們說這款有着跑車外觀的車 油耗出奇地低

    車主們說這款有着跑車外觀的車 油耗出奇地低

    只是高速時的風噪略大、儲物空間比較少,應該在四個門板多做一些儲物格。關於空間,我的身高176cm,把駕駛位置調好后,我在後排還有一拳多的腿部空間。而我的車型是2。0L的平均百公里油耗是7。8L。車主:Bestss購買車型:三廂 1。

    10多萬的合資A級車選擇非常多,要論最個性、最具動感外觀的車型,馬自達3昂克賽拉絕對是最具實力的車型之一。下面我們就來看看這款車的車主們都對它有哪些評價。

    長安馬自達-馬自達3 Axela昂克賽拉

    指導價:11.49-15.99萬

    車主:人稱啊明

    購買車型:三廂 1.5L自動豪華型

    裸車價格:12.89萬

    每一個男人都有一個跑車夢,昂克賽拉的外觀很像跑車,還有聰明的變速箱、讓人滿意的低油耗、起步快等優點,所以我最終選擇了這款車。

    它的操控真的不錯,給人的感覺是穩、實、准,轉向手感不錯,採用了四輪獨立懸架,支撐性好,在同級車型中性價比很高。

    目前我的車行駛了快8000公里了,平均百公里油耗只有7.1L!創馳藍天技術真不是蓋的。

    車主:佛山小偉

    購買車型:三廂 2.0L自動旗艦型

    裸車價格:14.99萬

    我對“魂動”的設計外觀和駕駛體驗最滿意,它指向精準、換擋果斷、動力也充沛。只是高速時的風噪略大、儲物空間比較少,應該在四個門板多做一些儲物格。

    關於空間,我的身高176cm,把駕駛位置調好后,我在後排還有一拳多的腿部空間。而我的車型是2.0L的平均百公里油耗是7.8L。

    車主:Bestss

    購買車型:三廂 1.5L手動豪華型

    裸車價格:12.29萬

    外觀和內飾就不用我多說了,大多數買昂克賽拉的人都是奔着漂亮的外觀去的!它的1.5L缸內直噴發動機動力夠用,2000轉以後的動力有比較大的爆發。

    行駛起來胎噪有些大,可能是輪胎側重抓地力的原因,還有就是車漆有些薄。

    目前我的車行駛了15000公里了,我對它比較滿意,目前的平均油耗是7.2L,油耗不算高!

    編者點評:

    昂克賽拉是一款性格鮮明的車型,它堅持採用四輪獨立懸挂、偏向性能的輪胎、AT變速箱等,讓它的操控性出色,如果你喜歡駕駛感受好的A級車,昂克賽拉絕對是一個不錯的選擇。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

    台北網頁設計公司這麼多該如何選擇?

    ※智慧手機時代的來臨,RWD網頁設計為架站首選

    ※評比南投搬家公司費用收費行情懶人包大公開

    ※回頭車貨運收費標準

  • 20萬就能買到全新寶馬轎車?!因為它真的來了

    20萬就能買到全新寶馬轎車?!因為它真的來了

    新車基於UKL前驅平台打造,1系三廂將會是前驅車型,新車的動力系統或為1。5T 136馬力+6速自動變速箱,2。0T 192馬力/231馬力+8擋手自一體變速箱,其中官方聲稱1。5T車型的百公里油耗最低可以達到5。5L。新車將會有無鑰匙啟動、抬頭显示、倒車影像、全景天窗、LED大燈、pM2。

    寶馬1系三廂自從誕生的那一刻就備受關注,吸睛無數,小編也和大家一樣,時刻關注着寶馬1系三廂的所有信息。畢竟,哪個男人心裏沒有這一個藍天白雲夢,開寶馬也是很多人的心愿。

    但是寶馬作為豪華品牌,價格不是每個消費者都能承受的起的。寶馬進口1系的價格不是很貴,但是國人就是對兩廂車有一定的排斥心理,比較鍾愛三廂車,所以即使進口1系兩廂的價格足夠便宜,但是買單的人照樣不多。

    當然,寶馬3系是三廂車,但是3系的價格在30萬左右,還是有點小貴。所以在20萬級別這個領域,出現了一個市場空缺。如果能有一台20萬的三廂寶馬,這應該是極好的選擇。

    看看奧迪A3就知道了,作為豪華品牌的A3將價格做到了20萬元左右,在這個沒有直接競爭對手的領域,A3的銷量好的一塌糊塗,A3在11月份交出了9883輛的銷量,將近萬輛的銷量足以看出來這個細分市場有很大的潛力。

    所以寶馬義不容辭的推出了國產版的1系三廂。

    寶馬1系三廂版基於Compact Sedan概念車打造出來的,新車的設計借鑒了概念車的設計元素,同時也具有着寶馬家族化的設計風格,前大燈的造型與3系比較相似,側麵線條比較平直,從外觀看像是縮小的3系,看起來短小精悍,富有運動感。

    內飾看起來還是那麼熟悉的感覺,畢竟也是採用了寶馬家族化的設計特徵,中控台造型很有層次感,並配備了8.8英寸液晶屏,同時還有大面積的鍍鉻裝飾,可以增強內飾的精緻感。

    新車基於UKL前驅平台打造,1系三廂將會是前驅車型,新車的動力系統或為1.5T 136馬力+6速自動變速箱,2.0T 192馬力/231馬力+8擋手自一體變速箱,其中官方聲稱1.5T車型的百公里油耗最低可以達到5.5L。

    新車將會有無鑰匙啟動、抬頭显示、倒車影像、全景天窗、LED大燈、pM2.5濾清器等,這些都是國人比較看重的配置。新車的預售價為20.5萬起,這就意味着也許不到20萬的價格就可以買到帥氣的三廂寶馬,估計很多消費者都會心動吧!如果實際售價能比預售價還低一點的話,那麼A3就會瞬間感到壓力了。

    競爭對手

    奧迪A3

    指導價:18.49-28.10萬

    A3在國內的成就有目共睹,但是它真正的競爭對手預計會在2月份正式上市銷售,憑藉著“藍天白雲”在國內的號召力,A3將會面臨很大壓力,那麼它能否守住自己的陣地,就讓我們拭目以待吧!本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

    網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

    ※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

    南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

    ※教你寫出一流的銷售文案?

    ※超省錢租車方案

  • 售價降低還換裝1.5T 這款合資轎車不輸思域

    售價降低還換裝1.5T 這款合資轎車不輸思域

    輪轂方面使用的是美規思域Si上的18英寸旋風式輪轂,樣式非常漂亮。內飾:基本沒有變化內飾方面也僅僅進行了一些小改動,基本保持着舊款的設計。但是增加了配色,導航也終於被加入到車機裏面。依舊使用着数字显示式儀錶盤,這是一種用過都說好的設計,数字显示的時速一目瞭然,而且較高的位置真有點抬頭显示的感覺。

    前言

    本田思域可謂是現今緊湊型轎車的當紅辣子雞,即使需要加價也難以阻擋人們對它的喜愛之情,其中最吸引他們的就是思域上那款動力油耗表現出色的1.5T發動機以及極高的配置。而最近本田為我們帶來2017款本田傑德,這輛大兩廂汽車更換了十代思域上的1.5T發動機,功率雖然有所降低,但是配置更為豐富,那麼它具體又有着怎樣的升級呢?又是否值得購買呢?

    傑德定位非常獨特,你可以將它當做一輛旅行車,也可以將其當做是MpV。而本田定位它是一輛緊湊型汽車,在筆者的眼中它是一輛大兩廂車,首先來自老款思域的平台讓它有着轎車般的駕駛感受,其次6座的布局實在和7座MpV有差異。這次2017款傑德的定價為12.99-17.99萬,購買門檻比起之前更低了。

    外觀:更換了LED光源以及新增配色,更為精神

    2017款傑德增加了新翠綠、波爾多紅等車身顏色,更為個性以及好看。在前臉方面進氣格柵增加了少許鍍鉻裝飾,看着更為時尚,而這種家族史設計使得傑德前臉更像是雅閣。

    而集成了LED日間行車燈的LED大燈非常醒目,亮度相當高,不過這是1.5T中高配車型的專利,1.8L以及1.5T最低配都與這LED大燈無緣。

    尾燈也同樣使用了LED燈源,辨識率更高,關鍵的一點是視覺效果更佳。除此以外,傑德使用了雙邊共雙出的排氣管設計,看着有一點性能味。

    離地間隙提升了10mm,舊款托底的毛病減弱不少,但是有一點需要注意,傑德是一輛兩廂車,對於兩廂車而言這個離地間隙已經是很大的了。輪轂方面使用的是美規思域Si上的18英寸旋風式輪轂,樣式非常漂亮。

    內飾:基本沒有變化

    內飾方面也僅僅進行了一些小改動,基本保持着舊款的設計。但是增加了配色,導航也終於被加入到車機裏面。

    依舊使用着数字显示式儀錶盤,這是一種用過都說好的設計,数字显示的時速一目瞭然,而且較高的位置真有點抬頭显示的感覺。

    配置:提升不少,但尚未完美

    這次配置上的提升是比較明顯的,讓傑德競爭力一下子提升不少,增加了LED大燈、日間行車燈、LED尾燈、18英寸輪轂、併線輔助系統、車道偏離系統、主動剎車、自適應巡航系統等,而且1.5T車型全系標配了全景天窗。

    傑德似乎是想要向思域看齊,但傑德卻沒有思域上的自動駐車以及电子手剎,稍顯遺憾,而且作為最低配車型並沒有配備ESp車身穩定系統。總的而言,傑德在配置上以及性價比上提升不少。

    動力:最大的亮點

    一直以來,傑德都是被當做是老款思域的重造產物,使用了同樣的平台,同樣的動力總成。底盤表現非常出色,但1.8L自然吸氣發動機卻難以挑起重擔,油耗以及耐用度優秀,卻給人白開水的感覺。這次加入的1.5T發動機,就像是辣椒一樣一下子把這款大兩廂車變得勁爆刺激味蕾。最大功率115千瓦,最大扭矩203牛米,比起思域上略有下降,依然是優秀水平,可以理解為思域上的1.5T低功率版本。

    和這款1.5T渦輪增壓發動機相配合的依然是CVT變速箱,和思域一樣,根據思域上平均8.5L的實測油耗,我們有理由相信使用同款發動機的傑德油耗也能同樣優秀。

    這一次2017款本田傑德的上市把之前的一些小問題幾乎都解決了,更低的價格、換上了更強悍的動力總成、加入了導航、更豐富的舒適性配置以及安全配置,這樣看來傑德是越趨完美。加上同價位並沒有相似的競爭對手,傑德可能會成為東本的第二個思域。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

    網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

    ※Google地圖已可更新顯示潭子電動車充電站設置地點!!

    ※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

    ※別再煩惱如何寫文案,掌握八大原則!

    網頁設計最專業,超強功能平台可客製化

  • 為何有點小錢的人都不願買國產車?

    為何有點小錢的人都不願買國產車?

    廢話這麼多,歸根結底說白了就是一個字 – 錢。當你的財力和社會地位提升起來后,相信你的內心自然會有答案。

    2016年汽車圈發生了很多事,其中令叫獸印象最深的是自主品牌的叫好聲四起,銷量上也取得了空前的突破。不過當叫獸冷靜下來理智的想一想,當下自主品牌真的是形勢一片大好,即將崛起了嗎?

    廢話這麼多,歸根結底說白了就是一個字 – 錢。當你的財力和社會地位提升起來后,相信你的內心自然會有答案。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

    ※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

    ※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

    南投搬家公司費用需注意的眉眉角角,別等搬了再說!

    ※教你寫出一流的銷售文案?

  • 好開、省油還有科技感,教授把這輛車推薦給挑剔的朋友們

    好開、省油還有科技感,教授把這輛車推薦給挑剔的朋友們

    聽了的介紹,三位老同學都下定決心要買17款新蒙迪歐了,我想既然他們都將是17款新蒙迪歐的車主了,所以約了他們提車三個月之後回來探討一些用車的經驗。三個月後,和三位老同學再次相聚,討論一下蒙迪歐的用車心得。智行第一位同學,也就是那位駕齡不長的女司機,她說讓她印象最深刻的還是17款新蒙迪歐的LKA車道保持輔助系統,一旦車輛在無意識情況下偏離車道,系統將通過震動方向盤和儀錶盤信息提醒,並輔助她重回當前行駛車道,這讓她在高速公路上行駛時避免了偏離車道所造成的危險。

    身邊的朋友知道喜歡玩車

    於是經常能收到他們的諮詢

    什麼十萬買啥車、二十萬買啥車

    諸如此類的問題

    其實都可以輕鬆應對的

    然而就像廣東話說的

    “上得山多終遇虎”

    也會有天被問題難住

    三個月前的同學聚會

    有三位老同學說他們感情好

    想買同一輛車,都要二十萬出頭而且夠大氣的

    首先女同學是一名女司機

    作為職業女性的她,要經常跑高速

    而且她還是新手

    所以她要我推薦一輛好開、安全的車給她

    第二位同學則是環保主義者

    什麼都不管,就要油耗低

    (大哥,外觀大氣的車好難找油耗低的吧)

    第三位同學是一名技術宅

    典型的IT男

    需要一輛有技術含量的車子

    聽了他們的要求后,第一時間是吐槽根本沒有這樣的車。但兢兢業業鍥而不舍的我在網上做了大量的搜索之後,發現有一輛車非常適合這三位老同學,那就是長安福特的17款新蒙迪歐。

    17款新蒙迪歐指導價17.98萬起,首先在價格上是符合要求的,然後在外觀上,馬丁式的家族前臉、LED大燈、2850mm的長軸距、以及肌肉感十足的車身線條,時尚個性又不失沉穩的外觀能讓不同年齡層的人接受。

    內飾方面,採用了對稱式的布局,整體的內飾簡潔明了,多媒體系統也已經升級到第三代的SYNC操作系統,操作更加流暢,功能也更加完善。除此以外,旋鈕式換擋的設計也讓車內的檔次感提升不少。

    行駛方面,拿2.0T車型來說,最大馬力達到245ps,搭配調校成熟的6AT手自一體變速箱,動力表現充沛且平順,絲毫不用擔心有小馬拉大車的感覺;底盤方面採用了多連桿獨立后懸架,整體偏向於舒適的調校,對細碎顛簸的過濾十分徹底。可以看出,實際的行駛表現也很符合蒙迪歐的定位。

    聽了的介紹,三位老同學都下定決心要買17款新蒙迪歐了,我想既然他們都將是17款新蒙迪歐的車主了,所以約了他們提車三個月之後回來探討一些用車的經驗。

    三個月後,和三位老同學再次相聚,討論一下蒙迪歐的用車心得。

    智行

    第一位同學,也就是那位駕齡不長的女司機,她說讓她印象最深刻的還是17款新蒙迪歐的LKA車道保持輔助系統,一旦車輛在無意識情況下偏離車道,系統將通過震動方向盤和儀錶盤信息提醒,並輔助她重回當前行駛車道,這讓她在高速公路上行駛時避免了偏離車道所造成的危險。

    除此以外,對於這位新手司機來說,帶行人識別功能的智能感應制動保護系統、以及只需控制油門和剎車,即可輕鬆把車停在理想位置的主動泊車輔助系統和ACC全速智能自適應巡航控制系統都讓她駕駛蒙迪歐的過程更加輕鬆。另外,車廂內的10個安全氣囊的環繞式防護也讓她駕駛的過程中更加安心。

    智擎

    至於那位作為環保主義者的老同學,關注油耗的他對17款新蒙迪歐的EcoBoost雙渦流渦輪增壓直噴發動機贊不絕口,因為先進的雙渦流渦輪增壓技術能有效緩解低速時的遲滯性,使峰值扭矩提早爆發,帶來更佳的燃油經濟性。

    而為了達到更好的節能環保效果,他選擇了Hybrid車型,17款新蒙迪歐的混合動力版本採用阿特金森循環發動機配合電動機,並搭載eCVT電控無級變速器,讓燃油與電力良好融合,高效環保,帶來煥然一新的駕駛體驗與樂趣。

    智聯

    最後一位老同學就是做IT男的技術宅,他最滿意的就是17款新蒙迪歐搭載的福特派TM互聯技術,只需要在手機中下載福特派TM應用,就可以遠程控制車輛並且通過手機來查看燃油剩餘量等車輛概況,十分方面。

    在多媒體功能方面,車主可以通過藍牙或者USB數據線將手機和車輛相連,來拓展多媒體的功能,同時,17款新蒙迪歐的多媒體系統支持智能聲控以及智能中文手寫輸入,支持多字連寫,讓人機之間的交互變得更加簡單。

    總結

    其實早就知道17款新蒙迪歐的三大亮點能夠讓我的這三位老同學滿足,“智行”讓駕駛更加輕鬆而且安全、“智擎”在提供充沛動力的同時又保證了良好的燃油經濟性、“智聯”則結合了時下流行的智能手機,既提供了用車的便利,又豐富了多媒體功能。三管齊下,相信不只是我的這三位老同學,廣大的消費者都會被17款新蒙迪歐吸引到。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

    網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

    ※想知道最厲害的網頁設計公司"嚨底家"!

    ※別再煩惱如何寫文案,掌握八大原則!

    ※產品缺大量曝光嗎?你需要的是一流包裝設計!